Module: ActionController::Rendering
- Extended by:
- ActiveSupport::Concern
- Included in:
- Base, DataStreaming
- Defined in:
- lib/action_controller/metal/rendering.rb
Defined Under Namespace
Modules: ClassMethods
Constant Summary collapse
- RENDER_FORMATS_IN_PRIORITY =
[:body, :plain, :html]
Instance Method Summary collapse
-
#render(*args) ⇒ Object
Renders a template and assigns the result to ‘self.response_body`.
-
#render_to_body(options = {}) ⇒ Object
:nodoc:.
-
#render_to_string ⇒ Object
Similar to #render, but only returns the rendered template as a string, instead of setting ‘self.response_body`.
Instance Method Details
#render(*args) ⇒ Object
Renders a template and assigns the result to ‘self.response_body`.
If no rendering mode option is specified, the template will be derived from the first argument.
render "posts/show"
# => renders app/views/posts/show.html.erb
# In a PostsController action...
render :show
# => renders app/views/posts/show.html.erb
If the first argument responds to ‘render_in`, the template will be rendered by calling `render_in` with the current view context.
class Greeting
def render_in(view_context)
view_context.render html: "<h1>Hello, World</h1>"
end
def format
:html
end
end
render(Greeting.new)
# => "<h1>Hello, World</h1>"
render(renderable: Greeting.new)
# => "<h1>Hello, World</h1>"
#### Rendering Mode
‘:partial` : See ActionView::PartialRenderer for details.
render partial: "posts/form", locals: { post: Post.new }
# => renders app/views/posts/_form.html.erb
‘:file` : Renders the contents of a file. This option should not be used with
unsanitized user input.
render file: "/path/to/some/file"
# => renders /path/to/some/file
‘:inline` : Renders an ERB template string.
@name = "World"
render inline: "<h1>Hello, <%= @name %>!</h1>"
# => renders "<h1>Hello, World!</h1>"
‘:body` : Renders the provided text, and sets the content type as `text/plain`.
render body: "Hello, World!"
# => renders "Hello, World!"
‘:plain` : Renders the provided text, and sets the content type as `text/plain`.
render plain: "Hello, World!"
# => renders "Hello, World!"
‘:html` : Renders the provided HTML string, and sets the content type as
`text/html`. If the string is not `html_safe?`, performs HTML escaping on
the string before rendering.
render html: "<h1>Hello, World!</h1>".html_safe
# => renders "<h1>Hello, World!</h1>"
render html: "<h1>Hello, World!</h1>"
# => renders "<h1>Hello, World!</h1>"
‘:json` : Renders the provided object as JSON, and sets the content type as
`application/json`. If the object is not a string, it will be converted to
JSON by calling `to_json`.
render json: { hello: "world" }
# => renders "{\"hello\":\"world\"}"
‘:renderable` : Renders the provided object by calling `render_in` with the current view
context. The response format is determined by calling `format` on the
renderable if it responds to `format`, falling back to `text/html` by
default.
render renderable: Greeting.new
# => renders "<h1>Hello, World</h1>"
By default, when a rendering mode is specified, no layout template is rendered.
#### Options
‘:assigns` : Hash of instance variable assignments for the template.
render inline: "<h1>Hello, <%= @name %>!</h1>", assigns: { name: "World" }
# => renders "<h1>Hello, World!</h1>"
‘:locals` : Hash of local variable assignments for the template.
render inline: "<h1>Hello, <%= name %>!</h1>", locals: { name: "World" }
# => renders "<h1>Hello, World!</h1>"
‘:layout` : The layout template to render. Can also be `false` or `true` to disable or
(re)enable the default layout template.
render "posts/show", layout: "holiday"
# => renders app/views/posts/show.html.erb with the app/views/layouts/holiday.html.erb layout
render "posts/show", layout: false
# => renders app/views/posts/show.html.erb with no layout
render inline: "<h1>Hello, World!</h1>", layout: true
# => renders "<h1>Hello, World!</h1>" with the default layout
‘:status` : The HTTP status code to send with the response. Can be specified as a
number or as the status name in Symbol form. Defaults to 200.
render "posts/new", status: 422
# => renders app/views/posts/new.html.erb with HTTP status code 422
render "posts/new", status: :unprocessable_entity
# => renders app/views/posts/new.html.erb with HTTP status code 422
– Check for double render errors and set the content_type after rendering.
165 166 167 168 |
# File 'lib/action_controller/metal/rendering.rb', line 165 def render(*args) raise ::AbstractController::DoubleRenderError if response_body super end |
#render_to_body(options = {}) ⇒ Object
:nodoc:
185 186 187 |
# File 'lib/action_controller/metal/rendering.rb', line 185 def render_to_body( = {}) # :nodoc: super || _render_in_priorities() || " " end |
#render_to_string ⇒ Object
Similar to #render, but only returns the rendered template as a string, instead of setting ‘self.response_body`. – Override render_to_string because body can now be set to a Rack body.
174 175 176 177 178 179 180 181 182 183 |
# File 'lib/action_controller/metal/rendering.rb', line 174 def render_to_string(*) result = super if result.respond_to?(:each) string = +"" result.each { |r| string << r } string else result end end |