Rails自定义渲染器

问题描述:

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

什么可以帮助是创建一个响应者(和使用较新的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