rails 3.0:ActionController :: Base render()

时间:2010-01-19 15:42:21

标签: ruby-on-rails

任何人都可以解释render()的来源 的ActionController ::基地?

我设法将其追踪到目前为止:

ActionController :: Base包含ActionController :: Rendering模块 render()方法已定义。但是这个定义调用了render() 超类。 Superclass是ActionController :: Metal。在其中 转为继承自AbstractController :: Base。这些都没有渲染 ()已定义或包含。

现在,大概它来自AbstractController :: Rendering,但我是 真的不知道如何包含它。

2 个答案:

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

renderAbstractController::Rendering中定义。它调用render_to_body,然后调度到其他方法。这有点像兔子洞,不是吗?