跳到內容跳到搜尋

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

屬性

[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

參數

  • controller - 要明確化呈現的控制器類別。

  • env - 呈現時用於仿冒要求的 Rack 環境。輸入可能是典型的 Rack 環境鍵和值,或可以用於適當轉換的下列任何一種

    • :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

    • :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 將合併到這些值的頂端。在呈現器執行個體上呼叫 new 時將保留 defaults

如果未指定 http_host,將從路由的 default_url_options 中推導出 env HTTP 主機。在此情況下,如果未指定,https 布林值和 script_name 也將從 default_url_options 中推導。此外,如果 default_url_options 未指定 protocolhttps 布林值將回退到 Rails.application.config.force_ssl

# File actionpack/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

實例公開方法

defaults()

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

new(env = nil)

使用相同的控制器建立新的渲染程式,但使用新的 Rack 環境。

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

使用相同的控制器建立新的渲染程式,但將指定的預設值與先前的預設值合併在一起。

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