Я пытался создать собственный рендерер на основе этого поста Иегуды Каца .
Это работает, если я звоню 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, но, похоже, недостаточно хорошо понимаю архитектуру рендеринга.
Может кто-нибудь подсказать, в чем проблема?