123456789_123456789_123456789_123456789_123456789_

Module: ActionController::Rendering

Relationships & Source Files
Namespace Children
Modules:
Extension / Inclusion / Inheritance Descendants
Included In:
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.

append_features, prepend_features

Instance Method Summary

Instance Method Details

#_normalize_options(options) (private)

Normalize both text and status options.

[ GitHub ]

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

def _normalize_options(options)
  _normalize_text(options)

  if options[:html]
    options[:html] = ERB::Util.html_escape(options[:html])
  end

  if options[:status]
    options[:status] = Rack::Utils.status_code(options[:status])
  end

  super
end

#_normalize_text(options) (private)

[ GitHub ]

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

def _normalize_text(options)
  RENDER_FORMATS_IN_PRIORITY.each do |format|
    if options.key?(format) && options[format].respond_to?(:to_text)
      options[format] = options[format].to_text
    end
  end
end

#_process_options(options) (private)

Process controller specific options, as status, content-type and location.

[ GitHub ]

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

def _process_options(options)
  status, content_type, location = options.values_at(:status, :content_type, :location)

  self.status = status if status
  self.content_type = content_type if content_type
  headers["Location"] = url_for(location) if location

  super
end

#_process_variant(options) (private)

[ GitHub ]

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

def _process_variant(options)
  if defined?(request) && !request.nil? && request.variant.present?
    options[:variant] = request.variant
  end
end

#_render_in_priorities(options) (private)

[ GitHub ]

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

def _render_in_priorities(options)
  RENDER_FORMATS_IN_PRIORITY.each do |format|
    return options[format] if options.key?(format)
  end

  nil
end

#_set_html_content_type (private)

[ GitHub ]

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

def _set_html_content_type
  self.content_type = Mime[:html].to_s
end

#_set_rendered_content_type(format) (private)

[ GitHub ]

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

def _set_rendered_content_type(format)
  if format && !response.media_type
    self.content_type = format.to_s
  end
end

#_set_vary_header (private)

[ GitHub ]

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

def _set_vary_header
  if response.headers["Vary"].blank? && request.should_apply_vary_header?
    response.headers["Vary"] = "Accept"
  end
end

#process_action (private)

This method is for internal use only.

Before processing, set the request formats in current controller formats.

[ GitHub ]

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

def process_action(*) # :nodoc:
  self.formats = request.formats.filter_map(&:ref)
  super
end

#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_body(options = {})

This method is for internal use only.
[ GitHub ]

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

def render_to_body(options = {}) # :nodoc:
  super || _render_in_priorities(options) || " "
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