この Yehuda Katz のブログ投稿に基づいて、カスタム レンダラーを作成しようとしています。
を呼び出すとrender :my_custom_renderer => "index"
機能しますが、デフォルトrespond_with
またはformat.my_custom_renderer
簡単な例を作成しました。
空のアプリから、次の行を追加します。
config/mime_types.rb:
Mime::Type.register_alias 'text/html', :my_custom_renderer
config/my_custom_renderer.rb で:
require "action_controller/metal/renderers"
ActionController.add_renderer :my_custom_renderer do |template, options|
self.mime_type ||= Mime::HTML
self.response_body = render_to_string(template).sub(/^/,
'\1<h1>Rendering Injection</h1>')
end
app/views/custom_renderer_test/index.my_custom_renderer.erb:
<h1>A message "Rendering Injection" should appear above</h1>
app/controllers/custom_renderer_test_controller.rb:
class CustomRenderingTestController < ApplicationController
def index
respond_to do |format|
# does not go through my custom renderer!
format.my_custom_renderer
# although it works if I explicitly do:
# format.my_custom_renderer { render :my_custom_renderer => 'index' }
end
end
end
最後に、config/routes.rb で:
root :to => "custom_rendering_test#index"
サーバーを起動してルート ページに移動すると、my_custom_renderer からのメッセージが表示されるはずですが、表示されません。Rails ソースを段階的にデバッグしてみましたが、レンダリング アーキテクチャを十分に理解していないようです。
誰かが私に問題が何であるかについてのヒントを教えてもらえますか?