3

この 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 ソースを段階的にデバッグしてみましたが、レンダリング アーキテクチャを十分に理解していないようです。

誰かが私に問題が何であるかについてのヒントを教えてもらえますか?

4

1 に答える 1

2

respond_with役立つかもしれないのは、明示的な方法でレスポンダーを作成する (そして newer を使用する) ことです。

class ActionController::Responder
  def to_my_custom_renderer
    controller.render :my_custom_renderer => controller.action_name
  end
end
于 2011-03-12T18:53:39.307 に答える