Class: ActionController::Renderer

Inherits:
Object
  • Object
show all
Defined in:
lib/action_controller/renderer.rb

Overview

# 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 }

Constant Summary collapse

DEFAULTS =
{
  method: "get",
  input: ""
}.freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(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`.



111
112
113
114
115
116
117
118
119
120
# File 'lib/action_controller/renderer.rb', line 111

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

Instance Attribute Details

#controllerObject (readonly)

Returns the value of attribute controller.



28
29
30
# File 'lib/action_controller/renderer.rb', line 28

def controller
  @controller
end

Class Method Details

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

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



64
65
66
# File 'lib/action_controller/renderer.rb', line 64

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

.normalize_env(env) ⇒ Object

:nodoc:



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/action_controller/renderer.rb', line 35

def self.normalize_env(env) # :nodoc:
  new_env = {}

  env.each_pair do |key, value|
    case key
    when :https
      value = value ? "on" : "off"
    when :method
      value = -value.upcase
    end

    key = RACK_KEY_TRANSLATION[key] || key.to_s

    new_env[key] = value
  end

  if new_env["HTTP_HOST"]
    new_env["HTTPS"] ||= "off"
    new_env["SCRIPT_NAME"] ||= ""
  end

  if new_env["HTTPS"]
    new_env["rack.url_scheme"] = new_env["HTTPS"] == "on" ? "https" : "http"
  end

  new_env
end

Instance Method Details

#defaultsObject



122
123
124
125
# File 'lib/action_controller/renderer.rb', line 122

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

#new(env = nil) ⇒ Object

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

ApplicationController.renderer.new(method: "post")


72
73
74
# File 'lib/action_controller/renderer.rb', line 72

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

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

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



129
130
131
132
133
134
135
136
137
# File 'lib/action_controller/renderer.rb', line 129

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) ⇒ Object

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



78
79
80
# File 'lib/action_controller/renderer.rb', line 78

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