2012-02-12 11 views
8

¿Cómo es posible forzar la recarga de una gema para cada solicitud?¿Cómo volver a cargar gema para cada solicitud en Rails 3.2?

Desarrollo una gema y me gustaría volver a cargar el código de mi gema cada vez que actualizo la página en un navegador. Mi Gemfile:

gem "my_gem", :path => "../my_gem" 

Para resolver el problema que intentó todas las sugerencias que figuran en stakoverflow. Nada ayudó. También se han encontrado dos parámetros de configuración de Rails: watchable_dirs y watchable_files. Intenté usarlos pero tampoco funcionan para mí.

+3

Alguien tiene que preguntar: * ¿Por qué? * ¿Qué problema estás tratando de resolver? –

+4

@La pregunta de Jordan es obvia: porque está desarrollando una gema, quiere cambiarla y depurarla sin problemas. – apneadiving

+0

Supongo que debes solicitar tu gema con una declaración 'to_prepare' en su archivo de inicialización, ver http://guides.rubyonrails.org/configuring.html#initialization-events – apneadiving

Respuesta

2

Debe marcar las clases que desea volver a cargar como descargables mediante ActiveSupport :: Dependencias método descargable;

class YourClass 
    unloadable 
end 

http://apidock.com/rails/ActiveSupport/Dependencies/Loadable/unloadable y http://robots.thoughtbot.com/post/159805560/tips-for-writing-your-own-rails-engine

debería darle algunos antecedentes. Alternativamente, puede hacer su propia recarga de esta manera;

Object.send(:remove_const, 'YOUR_CLASS') if Object.const_defined?('YOUR_CLASS') 
GC.start 
load 'path/to/your_file.rb' 
+0

el problema es que construyo un módulo y luego lo incluyo en ActionView: 'ActionView :: Base.send: include, MyGem :: Helper'. Entonces no tengo clases. En este caso, ¿dónde debo usar el método 'descargable'? – Vadim

+0

¡Perfecto, esto me solucionó el problema! Acabo de poner 'descargable si Rails.env.development?' En mi módulo, y funciona como un amuleto. ¡Gracias! –

2

He hecho un poco de caza para esto, pero al final me llevó un poco de prueba y error.

lib/my_gem/my_gem.rb:

require 'active_support/dependencies' 
ActiveSupport::Dependencies.autoload_paths += [File.expand_path("..", __FILE__)] 

module MyGem 
    include ActiveSupport::Dependencies 
    unloadable 
end 

Asegúrese de añadir “descargable” a todas sus clases.

Cuestiones relacionadas