2012-06-29 15 views
5

¿Es posible conocer la raíz del sistema de archivos Rails de una aplicación en el código de una gema incluida en una aplicación?¿Cómo obtengo el directorio raíz de una aplicación Rails en una Gema

Esta es una muestra de la fuente de la gema:

module MyGem 
    def self.included(base) 
    puts Rails.root # return nil 
    end 
end 

ActionController::Base.send :include, MyGem 

Agradezca y lo siento por mi pobre Inglés

+0

No se recomienda hablar en el chat aquí. Si va a agregar "gracias" a sus publicaciones (que no debe hacer de todos modos), escriba "gracias", no "thx". – meagar

+0

No he hecho mucho con ruby ​​gems, pero me pregunto si '' 'root_path''' no funcionará. –

+0

¿El directorio raíz del sistema de archivos? o el URL root_path? –

Respuesta

7

La solución que encontré para solucionar un problema similar es incluir mi módulo utilizando los inicializadores de railtie.

Así, en su /lib/mygem/railtie.rb

module MyGem 
    class Railtie < Rails::Railtie 
    initializer "Include your code in the controller" do 
     ActiveSupport.on_load(:action_controller) do 
     include MyGem 
     end 
    end 
end 

Con este código, se incluirá el módulo después de que se carga el ActionController y usted será capaz de utilizar Rails.root

Avísame si esto funciona para ti.

+0

Parece que funciona. ¡Muchas gracias! – sailor

2

Por supuesto:

Rails.root 

El hecho de que usted está escribiendo una joya doesn no significa que no puedas acceder al espacio de nombres global. La única preocupación sería si su Gem usa ese acceso antes de que el módulo Rails se configure durante la inicialización. Si encuentra que ese es el problema, publique el código que está usando, dónde está, y estaremos encantados de ayudar a solucionar el problema.

+0

Rails.root devuelve nulo en ese caso. – sailor

+0

Eso no debería suceder. Más contexto quizás: ¿la muestra que agregaste a la pregunta se ejecuta en una aplicación completa de Rails, o lo estás probando con RSpec o similar? Cuando en el proceso de inicialización llamas a #send: include? –

+0

Se ejecuta en una aplicación completa de Rails. Se llama al include cuando se incluye la gema, el código es básicamente el mismo ... – sailor

Cuestiones relacionadas