Rails Custom Renderer - PullRequest
       8

Rails Custom Renderer

3 голосов
/ 12 марта 2011

Я пытался создать собственный рендерер на основе этого поста Иегуды Каца .

Это работает, если я звоню 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

В приложении / views / custom_renderer_test / index.my_custom_renderer.erb:

<h1>A message "Rendering Injection" should appear above</h1>

В приложении / 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 / rout.rb:

root :to => "custom_rendering_test#index"

При запуске сервера и переходе на корневую страницу должно отображаться сообщение от my_custom_renderer, но это не так. Я пытался пошагово отлаживать исходный код Rails, но, похоже, недостаточно хорошо понимаю архитектуру рендеринга.

Может кто-нибудь подсказать, в чем проблема?

1 Ответ

2 голосов
/ 12 марта 2011

Что может помочь, это создать респондент (и использовать более новый respond_with) с явным методом:

class ActionController::Responder
  def to_my_custom_renderer
    controller.render :my_custom_renderer => controller.action_name
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...