Action Controller Renderer¶ ↑
ActionController::Renderer 允许你在控制器动作之外渲染任意模板。
你可以通过在控制器类上调用 renderer 来获取一个渲染器实例
ApplicationController.renderer PostsController.renderer
并通过调用 render 方法来渲染一个模板
ApplicationController.renderer.render template: "posts/show", assigns: { post: Post.first } PostsController.renderer.render :show, assigns: { post: Post.first }
作为快捷方式,你也可以直接在控制器类本身上调用 render
ApplicationController.render template: "posts/show", assigns: { post: Post.first } PostsController.render :show, assigns: { post: Post.first }
常量
| 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 |
类公共方法
new(controller, env, defaults) Link
初始化一个新的 Renderer。
Parameters¶ ↑
-
controller- 用于渲染的控制器类。 -
env- 用于模拟渲染时请求的 Rack env。条目可以是典型的 Rack env 键值对,也可以是以下任何一个,它们将被相应地转换:-
:http_host- 入站请求的 HTTP 主机。转换为 Rack 的HTTP_HOST。 -
:https- 布尔值,指示入站请求是否使用 HTTPS。转换为 Rack 的HTTPS。 -
:method- 入站请求的 HTTP 方法,不区分大小写。转换为 Rack 的REQUEST_METHOD。 -
:script_name- 入站请求 URL 路径中对应于应用程序的部分。转换为 Rack 的SCRIPT_NAME。 -
:input- 输入流。转换为 Rack 的rack.input。
-
-
defaults- Rack env 的默认值。条目的格式与env相同。env将合并到这些值之上。当在渲染器实例上调用new时,defaults将被保留。
如果没有指定 http_host,则 env HTTP 主机将从路由的 default_url_options 派生。在这种情况下,如果未指定 https 布尔值和 script_name,它们也将从 default_url_options 派生。此外,如果 default_url_options 没有指定 protocol,https 布尔值将回退到 Rails.application.config.force_ssl。
# 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
实例公共方法
defaults() Link
new(env = nil) Link
使用相同的控制器创建一个新的渲染器,但具有新的 Rack env。
ApplicationController.renderer.new(method: "post")
render(*args) Link
将模板渲染为字符串,就像 ActionController::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