Rails自定义渲染器

3
我一直在尝试创建一个基于Yehuda Katz的博客文章的自定义渲染器。

如果我调用render :my_custom_renderer => "index",它可以工作,但是默认的respond_withformat.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源代码,但似乎我对渲染架构的理解还不够深入。请问有人可以给我一些提示吗?

你需要传递格式变量,因此需要设置路由以传递它。 - Jakub Hampl
Rails 3会自动为所有路由传递它。尽管如此,我尝试添加它——但不起作用。(我做了:match "/test(.:format)" => "custom_rendering_test#index"root :to => redirect("/test.my_custom_renderer") - glebm
搞定了(更新了问题),但不是很好的方式。 - glebm
1个回答

2

可能会有所帮助的是创建一个响应器(并使用较新的respond_with)以显式方法:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接