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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top