2011-11-02 8 views
9

Nel file di schedule.rb, la dichiarazione:ogni volta che il file gemma schedule.rb: non recongize RAILS_ROOT variabile

require "#{RAILS_ROOT}/config/environment.rb" 

every "10 10 2 * * *" do 
     command "mysqldump -u #{@db_username} -p#{@db_password} --single-transaction #{@db_name} > #{@backup_Path}/#{@db_name}.sql 2> log/error_crontab.log" 
end 

Quando provo a eseguire il ogni volta cmd dal terminale, ottenendo il seguente errore:

config/schedule.rb:48:in `initialize': uninitialized constant Whenever::JobList::RAILS_ROOT (NameError) 
    from /usr/local/lib/ruby/gems/1.9.1/gems/whenever-0.7.0/lib/whenever/job_list.rb:19:in `instance_eval' 
    from /usr/local/lib/ruby/gems/1.9.1/gems/whenever-0.7.0/lib/whenever/job_list.rb:19:in `initialize' 
    from /usr/local/lib/ruby/gems/1.9.1/gems/whenever-0.7.0/lib/whenever.rb:16:in `new' 
    from /usr/local/lib/ruby/gems/1.9.1/gems/whenever-0.7.0/lib/whenever.rb:16:in `cron' 
    from /usr/local/lib/ruby/gems/1.9.1/gems/whenever-0.7.0/lib/whenever/command_line.rb:40:in `run' 
    from /usr/local/lib/ruby/gems/1.9.1/gems/whenever-0.7.0/lib/whenever/command_line.rb:7:in `execute' 
    from /usr/local/lib/ruby/gems/1.9.1/gems/whenever-0.7.0/bin/whenever:38:in `<top (required)>' 
    from /usr/local/bin/whenever:19:in `load' 
    from /usr/local/bin/whenever:19:in `<main>' 

sto usando l'istruzione require per ottenere i valori dinamici dal modulo per pianificare il lavoro. Si prega di aiutare a risolvere questo problema?

Nota: Ho visto le seguenti query StackOverflow: How to detect Rails environment inside whenever

A seguito di questa discussione per ottenere valori dinamici, ma di fronte a un problema con la necessaria dichiarazione. Rails - Whenever gem - Dynamic values

Ruby/Rails - Whenever gem - Loop cron tasks

config file in schedule.rb with Rails Whenever gem?

Grazie, Sudhir C.N.

+0

Rails 3 depreca 'RAILS_ROOT' in favore di' Rails.root'. Hai già provato questo? – polarblau

+0

Rails.root genera anche lo stesso errore – sudhir

risposta

28

Ogni volta che non richiede o dipende da Rails affatto, quindi quando viene eseguito, RAILS_ROOT non è definito, tuttavia poiché ogni volta che schedule.rb viene generalmente mantenuto in /config/schedule.rb, possiamo supporre che è in un progetto di rotaie, e impostare il nostro RAILS_ROOT come questo:

# in schedule.rb 
RAILS_ROOT = File.dirname(__FILE__) + '/..' 

Edit: nel caso in cui hai veramente bisogno Rails caricato, fare questo:

# in schedule.rb 
# this will require config/environment and load your entire rails environment 
require File.expand_path(File.dirname(__FILE__) + "/environment") 
+0

Un approccio simile è descritto qui: http://groups.google.com/group/whenever-gem/browse_thread/thread/e745f2fb3db7cd49 – polarblau

+0

sto ricevendo l'ID utente e la password del database dal modulo quindi, per passare a schedule.rb, ho bisogno di caricare l'ambiente delle rotaie in schedule.rb. – sudhir

+0

@sudhir In tal caso, ho aggiornato la mia risposta per richiedere effettivamente e avviare Rails. – Unixmonkey

18

l'ogni volta sviluppatore già risposto a questa domanda , controlla questo https://github.com/javan/whenever/issues/81

Javan Ogni volta che non si tenta più di caricare l'ambiente Rails. Tuttavia, imposta automaticamente una variabile di percorso nella directory ogni volta che è stata eseguita da. Questo dovrebbe funzionare lo stesso:

set :output, "#{path}/log/cron.log" 
+1

Grazie, molto più pulito della risposta accettata! – Toni

+1

Sei il benvenuto, so che a volte è difficile trovare una soluzione a un problema, ma quando finalmente lo trovo, mi piace condividerlo per aiutare gli altri a risparmiare tempo: D ... –

3

In Rails 4 provare con:

require File.expand_path(File.dirname(__FILE__) + "/../config/environment") 

nel file schedule.rb. In questo modo è possibile accedere a tutti i modelli di record attivi e agli inizializzatori.

Problemi correlati