2011-11-02 11 views
9

W pliku schedule.rb, oświadczenie:gdy plik gem schedule.rb: nie recongize RAILS_ROOT zmienną

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 

Kiedy próbuję wykonać lub zminimalizowania cmd z terminalu, otrzymuję następujący błąd:

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>' 

Używam instrukcji require, aby uzyskać wartości dynamiczne z formularza, aby zaplanować pracę. Pomóż rozwiązać ten problem?

Uwaga: Widziałem następujące StackOverflow zapytania: How to detect Rails environment inside whenever

obserwuję ten wątek, aby uzyskać wartości dynamiczne, ale w obliczu problemu z wymagać oświadczenia. Rails - Whenever gem - Dynamic values

Ruby/Rails - Whenever gem - Loop cron tasks

config file in schedule.rb with Rails Whenever gem?

Dzięki, Sudhir C.N.

+0

Rails 3 odrzuca 'RAILS_ROOT' na rzecz' Rails.root'. Czy próbowałeś już tego? – polarblau

+0

Rails.root również generuje ten sam błąd. – sudhir

Odpowiedz

28

W każdym przypadku nie wymaga ani nie zależy od Railsów, więc po uruchomieniu RAILS_ROOT nie jest zdefiniowany, jednak ponieważ plik schedule.rb jest zwykle przechowywany w /config/schedule.rb, możemy założyć, że jest w projekcie szynach i ustawić własne RAILS_ROOT takiego:

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

Edycja: w przypadku, gdy rzeczywiście trzeba Szyny załadowany, to zrobić:

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

Podobne podejście opisano tutaj: http://groups.google.com/group/whenever-gem/browse_thread/thread/e745f2fb3db7cd49 – polarblau

+0

Otrzymuję identyfikator użytkownika bazy danych i hasło z formularza , więc aby przekazać je do schedule.rb, muszę załadować środowisko rails w schedule.rb. – sudhir

+0

@sudhir W tym przypadku zaktualizowałem swoją odpowiedź, aby faktycznie wymagać i uruchomić Rails. – Unixmonkey

18

gdy deweloper już odpowiedział na to pytanie , sprawdź to https://github.com/javan/whenever/issues/81

Javan Ilekroć nie próbuje już załadować środowiska Rails. Jednak automatycznie ustawia zmienną ścieżki do katalogu, z którego został wykonany. To powinno działać tak samo:

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

Dzięki, o wiele czystsze niż zaakceptowana odpowiedź! – Toni

+1

Powodzenia, wiem, że czasami trudno jest znaleźć rozwiązanie problemu, ale kiedy w końcu go znajdę, chcę go udostępnić, aby pomóc innym zaoszczędzić czas: D ... –

3

w szynach 4 spróbuj:

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

w pliku schedule.rb. W ten sposób masz również dostęp do wszystkich swoich aktywnych modeli rekordów i inicjalizatorów.