2013-07-30 8 views
11

Spiegherò la mia situazione.Come richiedere alcuni file lib da qualsiasi luogo

Ecco il mio albero di file nella mia applicazione rotaie:

lib/my_module.rb

require 'my_module/my_file' 

module My_module 

end 

lib/my_module/my_file.rb

class Tweetag::Collector 
    (...) 
end 

Ho fatto un rubino script che ho messo in config/jobs/

Realmente non capisco come dovrei richiedere il file my_file.rb in questo file.

require '../../my_module/my_file.rb' 

Mi dà `require ': non può caricare tale file

stesso errore con un solo require 'my_module', che è quello che faccio nel mio controller ...

Qualcuno qui per spiegare ai me ? Grazie mille

risposta

11

È possibile autoinclude tutto sotto il lib folder ed evitare questi problemi:

Tipo questo il tuo file in config/application.rb

config.autoload_paths += %W(#{config.root}/lib) 
config.autoload_paths += Dir["#{config.root}/lib/**/"] 
+0

l'ho fatto, ma ancora: '

': non inizializzato costante MyModule (NameError) – Zoz

+0

ora includono il modulo dove serve, con' includono My_module' –

+0

stesso errore persistente .. .) – Zoz

10

se si desidera richiedere solo un file specifico poi,

fare qualcosa rispetto alla radice di Rails come questa

for ex: -- 

lib/plan.rb 

module Plan 
...some code... 
end 
.210

e se si desidera richiedere solo in alcuni modelli, dicono app/modelli/user.rb

fare modello utente

require "#{Rails.root}/lib/plan" 

class User < ActiveRecord::Base 
    include Plan 
end 

se si vuole che sia disponibile ovunque

una soluzione è data dalla @VecchiaSpugna

ed è anche possibile creare un file rubino nella cartella config/initializers

e richiedono tutti i file lì uno per uno

O

try this 

require '../../my_module/my_file' 

instead of 

require '../../my_module/my_file.rb' 

you don't need specify extension with require. 
+0

Beh, in realtà ho appena capito che non posso fare qualcosa di specifico per i binari come hai appena detto. Mi piacerebbe eseguire la riga di comando "ruby my_ruby_script.rb" e richiedere il mio modulo lib in esso. – Zoz

+0

@Zoz risposta aggiornata. –

4

Penso che ci sono due soluzioni.

1) Aggiungere il percorso lib al percorso di ricerca. In ruby:

$:.unshift('../../my_module/lib') 

Quindi è possibile require 'my_module.rb'

penso Vecchia Spugna answer è la rotaie-versione del mio ruby-risposta. (Non ho familiarità con le rotaie).

2) Un'altra soluzione:

Nella tua lib/my_module.rb si richiede my_file. Questo file si trova relativo al tuo my_module.rb? Quindi utilizzare require_relative:

require_relative './my_module/my_file' 
+0

1) è la strada da percorrere, dal momento che il lavoro in configurazione/lavori sembra non essere avviato dall'interno della sua applicazione rotaie. Pertanto, egli deve impostare il percorso di caricamento da solo mentre lo descrivi piuttosto che aspettarsi, che un ambiente di rotaie non utilizzato lo farà per lui. – tvw

Problemi correlati