Rails自定义渲染器

时间:2011-03-12 18:13:59

标签: ruby-on-rails ruby ruby-on-rails-3 renderer

我一直在尝试根据this Yehuda Katz's blog post创建自定义渲染器。

如果我拨打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源代码,但看起来我不太了解渲染架构。

有人可以告诉我一个问题是什么吗?

1 个答案:

答案 0 :(得分:2)

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

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