tutorial rails bootstrap ruby-on-rails ruby-on-rails-3.1 rails-engines helpers view-helpers

ruby-on-rails - bootstrap - sass rails tutorial



Rails 3.1: una mejor manera de exponer al ayudante de un motor dentro de la aplicación cliente (5)

He escrito dos publicaciones de blog sobre cómo crear motores desde cero, y seguirlos todo debería funcionar como se esperaba (sin necesidad de configuraciones adicionales). Tal vez usted todavía está interesado en:

Actualización: son tres artículos mientras tanto, y todavía hay algo de información por venir. Por favor, dame un comentario.

He encontrado algunos artículos que abordan el problema de los ayudantes dentro de un motor que no son accesibles para la aplicación consumidora (principal). Para asegurarnos de que todos estemos en la misma página, digamos que tenemos esto:

module MyEngine module ImportantHelper def some_important_helper ...do something important... end end end

Si nos fijamos en la documentación del motor de rieles en "Ayudantes del motor aislados" (L293), dice:

# Sometimes you may want to isolate engine, but use helpers that are defined for it. # If you want to share just a few specific helpers you can add them to application''s # helpers in ApplicationController: # # class ApplicationController < ActionController::Base # helper MyEngine::SharedEngineHelper # end # # If you want to include all of the engine''s helpers, you can use #helpers method on an engine''s # instance: # # class ApplicationController < ActionController::Base # helper MyEngine::Engine.helpers # end

Entonces, si le pido a cualquiera que consuma mi motor que agregue esto a su application_controller.rb, entonces tendrán acceso a todos mis métodos de ayuda importantes:

class ApplicationController < ActionController::Base helper MyEngine::ImportantHelper end

Esto es lo que quiero y funciona, pero es una molestia, especialmente si, como es mi caso de uso, todo lo que expone el motor puede / debe usarse en cualquier lugar de la aplicación consumidora. Así que busqué un poco más y encontré una solución que sugería que hiciera lo siguiente:

module MyEngine class Engine < Rails::Engine isolate_namespace MyEngine config.to_prepare do ApplicationController.helper(ImportantHelper) end end end

Ahora esto es exactamente lo que quiero: agregar todo mi método ImportantHelper al asistente de aplicación de la aplicación principal. Sin embargo, no funciona. ¿Alguien puede ayudarme a averiguar por qué esta solución mejor no funciona?

Estoy corriendo ruby ​​1.8.7 con rieles 3.1.3. Avíseme si perdí alguna información importante relacionada con el problema y gracias de antemano.


Incluir este código en engine.rb también es muy útil

config.before_initialize do ActiveSupport.on_load :action_controller do helper MyEngine::Engine.helpers end end

Básicamente su motor se vería como

module MyEngine class Engine < Rails::Engine isolate_namespace MyEngine # Here comes the code quoted above end end


Puedes crear un inicializador para lograr esto así:

module MyEngine class Engine < Rails::Engine initializer ''my_engine.action_controller'' do |app| ActiveSupport.on_load :action_controller do helper MyEngine::ImportantHelper end end end end


Si desea mantener el código en el motor, en lugar de cada aplicación de implementación, use esto:

module MyEngine class Engine < Rails::Engine isolate_namespace MyEngine config.to_prepare do MyEngine::ApplicationController.helper Rails.application.helpers end end end


module YourEngine module Helpers def a_helper end ... end end ActionController::Base.send(:helper, YourEngine::Helpers)