railsでrenderを指定しないmethodがどのようにrender先を指定しているのか確認try1

showメソッドはrenderって書かなくても表示する画面ファイルを認識できる。 なんでかなーと思ったので、確認。 まずは、実際にどのrenderメソッドが呼ばれているのかさんざん調べてたどり着いたのはsource_locationだそうな。 ググラビリティが欲しいです。

[15] pry(main)> obj.method(:render).source_location
=> ["~/demo_app/vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.4/lib/action_controller/metal/instrumentation.rb",
 38]
def render(*args)
  render_output = nil
  self.view_runtime = cleanup_view_runtime do
    Benchmark.ms { render_output = super }
  end
  render_output
end

pry使って確認してみたら、ブロック内のrender_output = superで生成されたhtmlがrender_outputに入ってきている。 module?なのにsuperってなんじゃらほいと頭がこんがらがってしまった。軽く調べてもよく分からなかったので、処理追ってみる。

ここまでですでに2時間ぐらい...

~/demo_app/vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.4/lib/action_controller/metal/rendering.rb @ line 15 ActionController::Rendering#render:

    14: def render(*args) #:nodoc:
 => 15:   raise ::AbstractController::DoubleRenderError if response_body
    16:   super
    17:   self.content_type ||= Mime[lookup_context.rendered_format].to_s
    18:   response_body
    19: end

ここでもまたsuper。

~/demo_app/vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.4/lib/abstract_controller/rendering.rb @ line 96 AbstractController::Rendering#render:

    95: def render(*args, &block)
 => 96:   options = _normalize_render(*args, &block)
    97:   self.response_body = render_to_body(options)
    98: end

render_to_body(options)が怪しい。 optionsの中身はこんなん。

[3] pry(#<UsersController>)> options
=> {:prefixes=>["users", "application"],
 :template=>"show",
 :layout=>
  #<Proc:0x007f8147a46170@~/demo_app/vendor/bundle/ruby/2.1.0/gems/actionpack-4.0.4/lib/abstract_controller/layouts.rb:383>}

今日はいったんここまでで。