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:
- Rieles 3.1 Motores: Parte I - El motor
- Carriles 3.1 Motores: Parte II - La gema
- Rieles 3.1 Motores: Parte III - El medio ambiente
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)