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
-
DEFAULTS =
# File 'actionpack/lib/action_controller/renderer.rb', line 30{ method: "get", input: "" }.freeze -
DEFAULT_ENV =
Internal use only
# File 'actionpack/lib/action_controller/renderer.rb', line 148normalize_env(DEFAULTS).freeze
-
RACK_KEY_TRANSLATION =
# File 'actionpack/lib/action_controller/renderer.rb', line 140{ http_host: "HTTP_HOST", https: "HTTPS", method: "REQUEST_METHOD", script_name: "SCRIPT_NAME", input: "rack.input" }
Class Method Summary
-
.for(controller, env = nil, defaults = DEFAULTS)
Creates a new renderer using the given controller class.
-
.new(controller, env, defaults) ⇒ Renderer
constructor
Initializes a new
Renderer. - .normalize_env(env) Internal use only
Instance Attribute Summary
- #controller readonly
- #normalize_env readonly
Instance Method Summary
- #defaults
-
#new(env = nil)
Creates a new renderer using the same controller, but with a new
::Rackenv. -
#render(*args)
(also: #render_to_string)
Renders a template to a string, just like Rendering#render_to_string.
-
#with_defaults(defaults)
Creates a new renderer using the same controller, but with the given defaults merged on top of the previous defaults.
- #env_for_request private
-
#render_to_string(*args)
Internal use only
Alias for #render.
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'sHTTP_HOST. -
:https- Boolean indicating whether the incoming request uses HTTPS. Converts to Rack'sHTTPS. -
:method- The HTTP method for the incoming request, case-insensitive. Converts to Rack'sREQUEST_METHOD. -
:script_name- The portion of the incoming request's URL path that corresponds to the application. Converts to Rack'sSCRIPT_NAME. -
:input- The input stream. Converts to Rack'srack.input.
-
- #defaults - Default values for the
::Rackenv. Entries are specified in the same format asenv.envwill 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.
# File 'actionpack/lib/action_controller/renderer.rb', line 110
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.
# File 'actionpack/lib/action_controller/renderer.rb', line 64
def self.for(controller, env = nil, defaults = DEFAULTS) new(controller, env, defaults) end
.normalize_env(env)
# File 'actionpack/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 Attribute Details
#controller (readonly)
[ GitHub ]# File 'actionpack/lib/action_controller/renderer.rb', line 28
attr_reader :controller
#normalize_env (readonly)
[ GitHub ]# File 'actionpack/lib/action_controller/renderer.rb', line 150
delegate :normalize_env, to: :class
Instance Method Details
#defaults
[ GitHub ]# File 'actionpack/lib/action_controller/renderer.rb', line 121
def defaults @defaults = @defaults.dup if @defaults.frozen? @defaults end
#env_for_request (private)
[ GitHub ]# File 'actionpack/lib/action_controller/renderer.rb', line 152
def env_for_request if @env.key?("HTTP_HOST") || controller._routes.nil? @env.dup else controller._routes.default_env.merge(@env) end end
#new(env = nil)
Creates a new renderer using the same controller, but with a new ::Rack env.
ApplicationController.renderer.new(method: "post")
# File 'actionpack/lib/action_controller/renderer.rb', line 72
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.
# File 'actionpack/lib/action_controller/renderer.rb', line 128
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
#render_to_string(*args)
Alias for #render.
# File 'actionpack/lib/action_controller/renderer.rb', line 137
alias_method :render_to_string, :render # :nodoc:
#with_defaults(defaults)
Creates a new renderer using the same controller, but with the given defaults merged on top of the previous defaults.
# File 'actionpack/lib/action_controller/renderer.rb', line 78
def with_defaults(defaults) self.class.new controller, @env, @defaults.merge(defaults) end