我一直在嘗試基於this Yehuda Katz's blog post創建自定義渲染器。Rails自定義渲染器
它的工作原理,如果我叫render :my_custom_renderer => "index"
,但它不使用默認respond_with
或format.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源代碼,但看起來我不太瞭解渲染架構。
有人可以給我一個關於什麼問題的提示嗎?
您需要通過格式變量,所以你需要建立路由傳遞它。 – 2011-03-12 18:18:16
Rails 3自動傳遞所有路由。儘管如此,嘗試添加它 - 不起作用。 (我做了:'match「/test(.:format)」=>「custom_rendering_test#index」'和 'root:to => redirect(「/ test.my_custom_renderer」)') – glebm 2011-03-12 18:21:41
得到它的工作(更新了問題),但不是一個很好的方式 – glebm 2011-03-12 18:43:44