任何人都可以解释render()的来源 的ActionController ::基地?
我设法将其追踪到目前为止:
ActionController :: Base包含ActionController :: Rendering模块 render()方法已定义。但是这个定义调用了render() 超类。 Superclass是ActionController :: Metal。在其中 转为继承自AbstractController :: Base。这些都没有渲染 ()已定义或包含。
现在,大概它来自AbstractController :: Rendering,但我是 真的不知道如何包含它。
答案 0 :(得分:8)
您在操作中调用的render
方法在ActionController::Base
中定义。
def render(action = nil, options = {}, &blk)
options = _normalize_options(action, options, &blk)
super(options)
end
此方法将调用传递给调用super
中定义的render
方法的ActionController::Rendering
。
def render(options)
super
self.content_type ||= options[:_template].mime_type.to_s
response_body
end
ActionController::Rendering
实际上是一个模块,混合到base.rb
文件开头的ActionController :: Base类中。
include ActionController::Redirecting
include ActionController::Rendering # <--
include ActionController::Renderers::All
如您在ActionController::Rendering
模块定义中所见,AbstractController::Rendering
包括ActionController::Rendering
。
module ActionController
module Rendering
extend ActiveSupport::Concern
included do
include AbstractController::Rendering
include AbstractController::LocalizedCache
end
AbstractController::Rendering
提供了render
方法,这是在渲染链中调用的最终方法。
# Mostly abstracts the fact that calling render twice is a DoubleRenderError.
# Delegates render_to_body and sticks the result in self.response_body.
def render(*args)
if response_body
raise AbstractController::DoubleRenderError, "Can only render or redirect once per action"
end
self.response_body = render_to_body(*args)
end
完整链是
AbstractController::Base#render
--> super()
--> ActionController::Rendering#render
--> super()
--> AbstractController::Rendering#render
--> render_to_body
答案 1 :(得分:0)
render
在AbstractController::Rendering
中定义。它调用render_to_body
,然后调度到其他方法。这有点像兔子洞,不是吗?