跳至内容 跳至搜索

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 }
方法
D
F
N
R
W

常量

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

类公共方法

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

使用给定的控制器类创建一个新的渲染器。参见 ::new

# File actionpack/lib/action_controller/renderer.rb, line 64
def self.for(controller, env = nil, defaults = DEFAULTS)
  new(controller, env, defaults)
end

new(controller, env, defaults)

初始化一个新的 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 没有指定 protocolhttps 布尔值将回退到 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()

# File actionpack/lib/action_controller/renderer.rb, line 121
def defaults
  @defaults = @defaults.dup if @defaults.frozen?
  @defaults
end

new(env = nil)

使用相同的控制器创建一个新的渲染器,但具有新的 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)

将模板渲染为字符串,就像 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

with_defaults(defaults)

使用相同的控制器创建一个新的渲染器,但将给定的默认值合并到之前的默认值之上。

# File actionpack/lib/action_controller/renderer.rb, line 78
def with_defaults(defaults)
  self.class.new controller, @env, @defaults.merge(defaults)
end