我一直在尝试创建一个基于Yehuda Katz的博客文章的自定义渲染器。
在config/my_custom_renderer.rb文件中:
在 app/views/custom_renderer_test/index.my_custom_renderer.erb 文件中:
启动服务器并访问根页面应该显示来自my_custom_renderer的消息,但实际上没有显示。我尝试逐步调试Rails源代码,但似乎我对渲染架构的理解还不够深入。请问有人可以给我一些提示吗?
如果我调用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源代码,但似乎我对渲染架构的理解还不够深入。请问有人可以给我一些提示吗?
match "/test(.:format)" => "custom_rendering_test#index"
和root :to => redirect("/test.my_custom_renderer")
) - glebm