123456789_123456789_123456789_123456789_123456789_

Class: ActionController::Renderer

Relationships & Source Files
Inherits: Object
Defined in: actionpack/lib/action_controller/renderer.rb

Overview

Renderer allows you to render arbitrary templates without being inside a controller action.

You can get a renderer instance by calling renderer on a controller class:

ApplicationController.renderer
PostsController.renderer

and render a template by calling the #render method:

ApplicationController.renderer.render template: "posts/show", assigns: { post: Post.first }
PostsController.renderer.render :show, assigns: { post: Post.first }

As a shortcut, you can also call #render directly on the controller class itself:

ApplicationController.render template: "posts/show", assigns: { post: Post.first }
PostsController.render :show, assigns: { post: Post.first }

Constant Summary

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(controller, env, defaults) ⇒ Renderer

Initializes a new Renderer.

Parameters

  • #controller - The controller class to instantiate for rendering.

  • env - The Rack env to use for mocking a request when rendering. Entries can be typical Rack env keys and values, or they can be any of the following, which will be converted appropriately:

    • :http_host - The HTTP host for the incoming request. Converts to Rack’s HTTP_HOST.

    • :https - Boolean indicating whether the incoming request uses HTTPS. Converts to Rack’s HTTPS.

    • :method - The HTTP method for the incoming request, case-insensitive. Converts to Rack’s REQUEST_METHOD.

    • :script_name - The portion of the incoming request’s URL path that corresponds to the application. Converts to Rack’s SCRIPT_NAME.

    • :input - The input stream. Converts to Rack’s rack.input.

  • #defaults - Default values for the ::Rack env. Entries are specified in the same format as env. env will be merged on top of these values. #defaults will be retained when calling #new on a renderer instance.

If no http_host is specified, the env HTTP host will be derived from the routes’ default_url_options. In this case, the https boolean and the script_name will also be derived from default_url_options if they were not specified. Additionally, the https boolean will fall back to Rails.application.config.force_ssl if default_url_options does not specify a protocol.

[ GitHub ]

  
# File 'actionpack/lib/action_controller/renderer.rb', line 106

def initialize(controller, env, defaults)
  @controller = controller
  @defaults = defaults
  if env.blank? && @defaults == DEFAULTS
    @env = DEFAULT_ENV
  else
    @env = normalize_env(@defaults)
    @env.merge!(normalize_env(env)) unless env.blank?
  end
end

Class Method Details

.for(controller, env = nil, defaults = DEFAULTS)

Creates a new renderer using the given controller class. See .new.

[ GitHub ]

  
# File 'actionpack/lib/action_controller/renderer.rb', line 61

def self.for(controller, env = nil, defaults = DEFAULTS)
  new(controller, env, defaults)
end

Instance Attribute Details

#controller (readonly)

[ GitHub ]

  
# File 'actionpack/lib/action_controller/renderer.rb', line 25

attr_reader :controller

#normalize_env (readonly)

[ GitHub ]

  
# File 'actionpack/lib/action_controller/renderer.rb', line 145

delegate :normalize_env, to: :class

Instance Method Details

#defaults

[ GitHub ]

  
# File 'actionpack/lib/action_controller/renderer.rb', line 117

def defaults
  @defaults = @defaults.dup if @defaults.frozen?
  @defaults
end

#new(env = nil)

Creates a new renderer using the same controller, but with a new ::Rack env.

ApplicationController.renderer.new(method: "post")
[ GitHub ]

  
# File 'actionpack/lib/action_controller/renderer.rb', line 69

def new(env = nil)
  self.class.new controller, env, @defaults
end

#render(*args) Also known as: #render_to_string

Renders a template to a string, just like Rendering#render_to_string.

[ GitHub ]

  
# File 'actionpack/lib/action_controller/renderer.rb', line 123

def render(*args)
  request = ActionDispatch::Request.new(env_for_request)
  request.routes = controller._routes

  instance = controller.new
  instance.set_request! request
  instance.set_response! controller.make_response!(request)
  instance.render_to_string(*args)
end

#with_defaults(defaults)

Creates a new renderer using the same controller, but with the given defaults merged on top of the previous defaults.

[ GitHub ]

  
# File 'actionpack/lib/action_controller/renderer.rb', line 75

def with_defaults(defaults)
  self.class.new controller, @env, @defaults.merge(defaults)
end