2012-06-29 7 views
5

È possibile conoscere la radice del file system Rails di un'applicazione nel codice di una gemma inclusa in un'app?Come ottenere la directory principale di un'app Rails in una gemma

Questo è un esempio della fonte gemma:

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

ActionController::Base.send :include, MyGem 

Grazie di e dispiace per il mio povero inglese

+0

La chat è scoraggiata qui. Se aggiungerai "grazie" ai tuoi post (cosa che non dovresti fare comunque), digita "thanks", non "thx". – meagar

+0

Non ho fatto molto con le gemme di rubino, ma mi chiedo se '' 'root_path''' non funzioni? –

+0

La directory principale del file system? o l'URL root_path? –

risposta

7

La soluzione che ho trovato per risolvere un problema simile a questo è includere il mio modulo utilizzando gli inizializzatori railtie.

Così, nel vostro /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 questo codice, il modulo sarà incluso dopo che l'ActionController viene caricato e si sarà in grado di utilizzare Rails.root

Fatemi sapere se questo funziona per voi.

+0

Sembra funzionare. Molte grazie! – sailor

2

Naturalmente:

Rails.root 

Solo perché si sta scrivendo una gemma doesn Significa che non è possibile accedere allo spazio dei nomi globale. L'unica preoccupazione potrebbe essere se il tuo Gem usa quell'accesso prima che il modulo Rails sia impostato durante l'inizializzazione. Se trovi che questo è il problema, pubblica il codice che stai utilizzando, dove si trova e saremo lieti di aiutarti a risolvere il problema.

+0

Rails.root restituisce nil in questo caso. – sailor

+0

Questo non dovrebbe accadere. Forse più contesto: l'esempio che hai aggiunto alla domanda in esecuzione in un'app Rails completa o lo stai testando con RSpec o simile? Quando nel processo di inizializzazione stai chiamando #send: include? –

+0

È in esecuzione in un'app Rails completa. L'inclusione viene chiamata quando la gemma viene inclusa, il codice è fondamentalmente lo stesso ... – sailor

Problemi correlati