我一直在尝试基于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