¿Cómo consigo los carriles para dejar de volver a cargar mis joyas?
-
19-09-2019 - |
Pregunta
Tengo una joya:
# in /Library/Ruby/Gems/1.8/gems/my_gem-1.0.0/lib/my_gem.rb
module MyGem
def do_stuff
..
end
end
Y cargué en Rails:
# in [rails_root]/config/environment.rb:
config.gem 'my_gem', :version => '1.0.0'
y lo usamos:
# in [rails_root]/app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
include MyGem
end
Pero necesito mono-parche que es un poco de una manera específica del entorno:
# in [rails_root]/config/environments/development.rb:
MyGem.class_eval do
def do_stuff
raise 'Ack! - just testing'
end
end
Por desgracia, las recargas MyGem
en cada petición, por lo que mi mono-parcheo es inútil.
load_once_paths
He comprobado:
ActiveSupport::Dependencies.load_once_paths
# => ["/Library/Ruby/Gems/1.8/gems/my_gem-1.0.0/lib", "other stuff"]
Cualquier idea de cómo puedo conseguir el efecto que quiero?
Solución
Parece que está trabajando en el modo de desarrollo, donde Rieles cargas todas las clases en todas las solicitudes para ayudar a los desarrolladores para reflejar el código cambia + que ha incluido la joya en su controlador. Para superar esto, vaya a project_path / config / ambientes / development.rb y añadir esta línea
config.cache_classes = true
Tenga en cuenta que usted no tendrá que reflejan los cambios de código a menos que reinicie el servidor.
Actualización 1 : También como una segunda solución se puede añadir el parche moneky después de que se incluye la joya en ese controlador. Usted puede agregar a la parte inferior del archivo de su controlador.
Actualización 2 : Una tercera solución (recomendado) Si usted puede agregar el siguiente fragmento de my_gem.rb
class ActionController::Base
include MyGem
end
A continuación, deben funcionar las cosas, ya que no tendrá que incluir manualmente en el controlador de la aplicación.
Otros consejos
Si está incluida la joya en su environment.rb
que no es necesario incluirlo en su controlador.
Es posible que desee pensar en cómo los ganchos de la gema en ActionController - suena como desea agregar métodos de la clase a ActionController :: Base, que es bastante sencillo. Echar un vistazo a la cantidad de gemas comunes implementar esto.
Parece demasiado, como puede ser que incluso desee comprobar la existencia y valor de RAILS_ENV
para garantizar un comportamiento diferente para diferentes entornos.