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>}
今日はいったんここまでで。