Action Controller Renderer

ActionController::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 }

Methods

Constants

DEFAULTS = { method: "get", input: "" }.freeze
RACK_KEY_TRANSLATION = { http_host: "HTTP_HOST", https: "HTTPS", method: "REQUEST_METHOD", script_name: "SCRIPT_NAME", input: "rack.input" }

Attributes

[R] controller

Class Public methods

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

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

📝 Source code
# File actionpack/lib/action_controller/renderer.rb, line 61
    def self.for(controller, env = nil, defaults = DEFAULTS)
      new(controller, env, defaults)
    end
🔎 See on GitHub

new(controller, env, defaults)

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.

📝 Source code
# 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
🔎 See on GitHub

Instance Public methods

defaults()

📝 Source code
# File actionpack/lib/action_controller/renderer.rb, line 117
    def defaults
      @defaults = @defaults.dup if @defaults.frozen?
      @defaults
    end
🔎 See on GitHub

new(env = nil)

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

ApplicationController.renderer.new(method: "post")
📝 Source code
# File actionpack/lib/action_controller/renderer.rb, line 69
    def new(env = nil)
      self.class.new controller, env, @defaults
    end
🔎 See on GitHub

render(*args)

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

📝 Source code
# 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
🔎 See on GitHub

with_defaults(defaults)

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

📝 Source code
# File actionpack/lib/action_controller/renderer.rb, line 75
    def with_defaults(defaults)
      self.class.new controller, @env, @defaults.merge(defaults)
    end
🔎 See on GitHub