123456789_123456789_123456789_123456789_123456789_

Module: ActionController::Rendering

Relationships & Source Files
Namespace Children
Modules:
Extension / Inclusion / Inheritance Descendants
Included In:
API, Base, DataStreaming, ::ActionView::TestCase::TestController, Rails::ApplicationController, ::Rails::HealthController, Rails::InfoController, Rails::MailersController, Rails::PwaController, Rails::WelcomeController
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Defined in: actionpack/lib/action_controller/metal/rendering.rb

Constant Summary

Class Method Summary

::ActiveSupport::Concern - Extended

class_methods

Define class methods from given block.

included

Evaluate given block in context of base class, so that you can write class macros here.

prepended

Evaluate given block in context of base class, so that you can write class macros here.

Instance Method Summary

  • #render(*args)

    Renders a template and assigns the result to self.response_body.

  • #render_to_string

    Similar to #render, but only returns the rendered template as a string, instead of setting self.response_body.

Instance Method Details

#render(*args)

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 "&lt;h1&gt;Hello, World!&lt;/h1&gt;"

: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
[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/rendering.rb', line 165

def render(*args)
  raise ::AbstractController::DoubleRenderError if response_body
  super
end

#render_to_string

Similar to #render, but only returns the rendered template as a string, instead of setting self.response_body.

[ GitHub ]

  
# File 'actionpack/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