2011-03-12 276 views
3

我一直在嘗試基於this Yehuda Katz's blog post創建自定義渲染器。Rails自定義渲染器

它的工作原理,如果我叫render :my_custom_renderer => "index",但它不使用默認respond_withformat.my_custom_renderer

我創建了一個簡單的例子工作。

從空白的應用中添加下列行:

在配置/ mime_types.rb:

Mime::Type.register_alias 'text/html', :my_custom_renderer 

在配置/ 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 

在應用程序/觀點/custom_renderer_test/index.my_custom_renderer.erb:

<h1>A message "Rendering Injection" should appear above</h1> 

在應用程序/控制器/ 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 

最後,在配置/ routes.rb中:

root :to => "custom_rendering_test#index" 

啓動了服務器和去根頁面應該顯示消息來自my_custom_renderer,但它沒有。我已經試過一步一步地調試Rails源代碼,但看起來我不太瞭解渲染架構。

有人可以給我一個關於什麼問題的提示嗎?

+0

您需要通過格式變量,所以你需要建立路由傳遞它。 – 2011-03-12 18:18:16

+0

Rails 3自動傳遞所有路由。儘管如此,嘗試添加它 - 不起作用。 (我做了:'match「/test(.:format)」=>「custom_rendering_test#index」'和 'root:to => redirect(「/ test.my_custom_renderer」)') – glebm 2011-03-12 18:21:41

+0

得到它的工作(更新了問題),但不是一個很好的方式 – glebm 2011-03-12 18:43:44

回答

2

什麼可以幫助是創建一個響應者(和使用較新的respond_with)有明確的方法:

class ActionController::Responder 
    def to_my_custom_renderer 
    controller.render :my_custom_renderer => controller.action_name 
    end 
end 
+0

我在哪裏把這個?的ActiveRecord :: Base的? – glebm 2011-03-12 19:22:20

+1

對於'ActionController :: Responder' http://apidock.com/rails/ActionController/Responder,或者你可以繼承它並擁有你自己的類,然後在ApplicationController中將它設置爲'self.responder'。 – 2011-03-12 19:24:51

+0

謝謝,這工作。不得不通過 – glebm 2011-03-12 19:50:31