- The document discusses various rendering methods and layouts in Rails, including default rendering, using the 'render' method, options for render like :content_type and :layout, and using redirect_to versus render. It also covers finding and structuring layouts, asset tag helpers, and head-only responses.
6. Default Rendering
/books
class BooksController < ApplicationController
end
BooksController
resources :books
config/routes.rb
<h1>Books are coming soon!</h1>
app/views/books/index.html.erb
7. Default Rendering
resources :books
config/routes.rb
$ rake routes CONTROLLER=books
books GET /books(.:format) books#index
POST /books(.:format) books#create
new_book GET /books/new(.:format) books#new
edit_book GET /books/:id/edit(.:format) books#edit
book GET /books/:id(.:format) books#show
PUT /books/:id(.:format) books#update
DELETE /books/:id(.:format) books#destroy
8. Default Rendering
class BooksController < ApplicationController
def index
@books = Book.all
end
end
• {action_name}.html.erb
C oC : app/views/books/index.html.erb
10. Using ‘Render’
Many ways to customize rendering
• Default view
: for a Rails template / a specific template / a file / inline code /
nothing
• text / JSON / XML
class BooksController < ApplicationController
def index
@books = Book.all
render “index”
render_to_string “index”
render :nothing => true
end
end
11. Using ‘Render’
Rendering an Action’s view
def update
@book = Book.find(params[:id])
if @book.update_attributes(params[:book])
redirect_to(@book)
else
render "edit"
end
as a String
end
12. Using ‘Render’
Rendering an Action’s view
def update
@book = Book.find(params[:id])
if @book.update_attributes(params[:book])
redirect_to(@book)
else
render :edit
end
as a Symbol
end
13. Using ‘Render’
Rendering an Action’s view
def update
@book = Book.find(params[:id])
if @book.update_attributes(params[:book])
redirect_to(@book)
else
render :action => "edit"
end
to render “edit” action’s view
end
14. Using ‘Render’
Rendering an Action’s Template
from Another Controller
def update
@book = Book.find(params[:id])
if @book.update_attributes(params[:book])
redirect_to(@book)
else
render "products/show"
render :template => "products/show"
end
from another controller
end
15. Using ‘Render’
Rendering an Arbitrary File
def update
@book = Book.find(params[:id])
if @book.update_attributes(params[:book])
redirect_to(@book)
else
render "/u/apps/warehouse_app/current/app/
views/products/show"
render :file => "/u/apps/warehouse_app/current/
app/views/products/show", :layout => true
end
end
24. Options
for Render
:layout option
render :layout => 'special_layout'
to tell Rails to use a specific file
as the layout for the current action
render :layout => false
25. Options
for Render
:location option
render :xml => photo, :location => photo_url(photo)
to set the HTTP Location header
27. Status Code Status Message Symbol Status Code Status Message Symbol
1xx Informational 406 Not Acceptable :not_acceptable
100 Continue :continue Proxy Authentication :proxy_authentication_req
407
101 Switching Protocols :switching_protocols Required uired
408 Request Timeout :request_timeout
102 Processing :processing
409 Conflict :conflict
2xx Success 410 Gone :gone
200 OK :ok 411 Length Required :length_required
201 Created :created
412 Precondition Failed :precondition_failed
202 Accepted :accepted
413 Request Entity Too Large :request_entity_too_large
203 Non-Authoritative :non_authoritative_inform
Information ation 414 Request-URI Too Long :request_uri_too_long
204 No Content :no_content
205 Reset Content :reset_content 415 Unsupported Media Type :unsupported_media_type
206 Partial Content :partial_content 416 Requested Range Not :requested_range_not_sati
207 Multi-Status :multi_status Satisfiable sfiable
417 Expectation Failed :expectation_failed
226 IM Used :im_used
422 Unprocessable Entity :unprocessable_entity
423 Locked :locked
3xx Redirection
300 Multiple Choices :multiple_choices 424 Failed Dependency :failed_dependency
301 Moved Permanently :moved_permanently 426 Upgrade Required :upgrade_required
302 Found :found
303 See Other :see_other
5xx Server Error
304 Not Modified :not_modified
500 Internal Server Error :internal_server_error
305 Use Proxy :use_proxy
307 Temporary Redirect :temporary_redirect 501 Not Implemented :not_implemented
4xx Client Error 502 Bad Gateway :bad_gateway
400 Bad Request :bad_request 503 Service Unavailable :service_unavailable
401 Unauthorized :unauthorized
504 Gateway Timeout :gateway_timeout
402 Payment Required :payment_required
505 HTTP Version Not :http_version_not_support
403 Forbidden :forbidden Supported ed
404 Not Found :not_found 507 Insufficient Storage :insufficient_storage
405 Method Not Allowed :method_not_allowed 510 Not Extended :not_extended
28. Finding Layouts
• Rails first looks for a file in app/views/layouts
with the same base name as the controller.
Current
Controller layout
layout
inheritance
Application layout
29. Finding Layouts
Specifying Layouts for Controllers
class ProductsController < ApplicationController
layout "inventory"
#...
end
app/views/layouts/inventory.html.erb
class ApplicationController < ActionController::Base
layout "main"
#...
end
app/views/layouts/main.html.erb
30. Finding Layouts
Choosing Layouts at Runtime
class ProductsController < ApplicationController
layout :products_layout
def show
@product = Product.find(params[:id])
end
private
def products_layout
@current_user.special? ? "special" : "products"
end
end
31. Finding Layouts
Choosing Layouts at Runtime
class ProductsController < ApplicationController
layout Proc.new { |controller|
controller.request.xhr? ? 'popup' : 'application' }
end
using inline method!
32. Finding Layouts
Conditional Layouts
class ProductsController < ApplicationController
layout "product", :only => [:index, :rss]
end
class ProductsController < ApplicationController
layout "product", :except => [:index, :rss]
end
33. Finding Layouts
Layout Inheritance (1) cascading downward
‣ application_controller.rb
class ApplicationController < ActionController::Base
layout "main"
end
‣ posts_controller.rb
class PostsController < ApplicationController
end
34. Finding Layouts
Layout Inheritance (2) cascading downward
‣ special_posts_controller.rb
class SpecialPostsController < PostsController
layout "special"
end
35. Finding Layouts
cascading downward
Layout Inheritance (3)
‣ old_posts_controller.rb
class OldPostsController < SpecialPostsController
layout false
def show
@post = Post.find(params[:id])
end
def index
@old_posts = Post.older
render :layout => "old"
end
# ...
end
36. Using Redirect_to
• redirect_to
- tell the browser to send a new request
for a different URL
• cf. render
- a view template
redirect_to photos_url
redirect_to :back
37. Using Redirect_to s : 30
2
tatu
lt s
de fau
Different Redirect Status Code
redirect_to photos_path, :status => 301
38. Using Redirect_to
Render vs Redirect_to
def index def index
@books = Book.all @books = Book.all
end end
def show def show
@book = Book.find_by_id(params[:id]) @book = Book.find_by_id(params[:id])
if @book.nil? if @book.nil?
render :action => "index" redirect_to :action => :index
end end
end end
a round trip to the browser
39. Using Redirect_to
Render vs Redirect_to
def index
@books = Book.all
end
def show
@book = Book.find_by_id(params[:id])
if @book.nil?
@books = Book.all
render "index", :alert => 'Your book was not found!'
end
end
one stop rendering
40. Head-Only
Responses
• render :nothing
• a more obvious alternative
‘head’ method
41. Head-Only
Responses
head :bad_request
HTTP/1.1 400 Bad Request
Connection: close
Date: Sun, 24 Jan 2010 12:15:53 GMT
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8
X-Runtime: 0.013483
Set-Cookie: _blog_session=...snip...; path=/; HttpOnly
Cache-Control: no-cache
42. Head-Only
Responses
head :created, :location => photo_path(@photo)
HTTP/1.1 201 Created
Connection: close
Date: Sun, 24 Jan 2010 12:16:44 GMT
Transfer-Encoding: chunked
Location: /photos/1
Content-Type: text/html; charset=utf-8
X-Runtime: 0.083496
Set-Cookie: _blog_session=...snip...; path=/; HttpOnly
Cache-Control: no-cache
43. Structuring
Layouts
Three tools for knitting fragmented outputs
• Asset tags ( for asset links )
• yield and content_for ( for layouts )
• Partials ( for refactoring )
44. Structuring
Layouts
Asset Tag Helpers
• auto_discovery_link_tag
• javascript_include_tag in <head> section
• stylesheet_link_tag
• image_tag
• video_tag in <body> section
• audio_tag
45. Structuring
Layouts
Asset Tag Helpers
auto_discovery_link_tag RSS or ATOM feeds
<%= auto_discovery_link_tag(:rss, {:action => "feed"},
{:title => "RSS Feed"}) %>
57. Partial
• breaking the render process into more
chunks
• moving the code chunk to its own file
• _partial.html.erb vs partial.html.erb
• to simplify views
• partial layout
58. Partial
<%= render "menu" %>
<%= render "shared/menu" %>
<%= render "shared/ad_banner" %>
<h1>Products</h1>
<p>Here are a few of our fine products:</p>
...
<%= render "shared/footer" %>
<%= render :partial => "link_area", :layout => "graybar"
60. A Partial variable
• a local variable with the same name as the
partial
• pass an object in to this local variable
<%= render :partial => "customer", :object => @new_customer %>
<%= render @customer %>
61. Rendering Collections
Rails determines the name of the partial to use by looking at
the model name in the collection. In fact, you can even create a
heterogeneous collection and render it this way
<h1>Products</h1>
<%= render :partial => "product",
:collection => @products %>
index.html.erb
<p>Product Name: <%= product.name %></p>
_product.html.erb
62. Rendering Collections
Rails determines the name of the partial to use by looking at
the model name in the collection. In fact, you can even create a
heterogeneous collection and render it this way
ra
ils
3.
<h1>Products</h1> 0
<%= render(@products) || ‘there are no products
available.’ %>
index.html.erb
<p>Product Name: <%= product.name %></p>
_product.html.erb