2016-01-08 34 views
1

我寫了一個Ruby腳本,我想作爲Rake任務運行。以下是我的data.rake文件:Rake任務中的這個Ruby腳本爲什麼不能使用Rails環境?

namespace :data do 
    namespace :fixtures do 
    desc "Save fixtures to JSON file" 
    task :file do 
     bundle exec ruby "#{Rails.root}/lib/tasks/get_fixtures.rb" 
    end 

    desc "Save fixtures to DB" 
    task db: :environment do 
     # puts League.all.inspect 
     bundle exec ruby "#{Rails.root}/lib/tasks/save_fixtures_to_db.rb" 
    end 
    end 
end 

data:fixutres:db任務時,註釋行使用League.new它的內部時,工作正常,並表示聯盟的數據作爲一個ActiveRecord的查詢,而Ruby腳本引發以下錯誤:

`save_to_db': uninitialized constant League (NameError) 
    from /home/fred/workspace/plprediction/lib/tasks/save_fixtures_to_db.rb:134:in `<main>' 
rake aborted! 
Command failed with status (1): [/home/fred/.rvm/rubies/ruby-2.2.1/bin/ruby...] 
/home/fred/workspace/plprediction/lib/tasks/data.rake:11:in `block (3 levels) in <top (required)>' 
/home/fred/.rvm/gems/[email protected]/bin/ruby_executable_hooks:15:in `eval' 
/home/fred/.rvm/gems/[email protected]/bin/ruby_executable_hooks:15:in `<main>' 
Tasks: TOP => data:fixtures:db 
(See full trace by running task with --trace) 

我迷失在這裏。我不知道爲什麼環境只在rake任務中可用,而不是rake任務中的Ruby腳本。

+0

如果您需要您的應用程序通過'require File.expand_path('../ config/environment',__FILE __)'它是否有效? – Anthony

+0

是的,安東尼,那是有效的。但是,我不想硬編碼它,當有一種方法可以工作,但不是。 – RuppalSingh

回答

3

由於您構建Rake調用的方式,環境只能在rake任務中使用,而不能在rake任務中使用Ruby腳本。你正在開發一個額外的過程(這需要加載環境本身來「回到」你的Rake過程已經存在的地方)。

您的lib/tasks/get_fixtures.rb任務可能工作,因爲它只使用Ruby代碼,而不使用Rails。 (這是猜測,因爲該代碼是不可用的。)

在這種情況下,我通常將類似save_fixtures_to_db.rb的內容放在Class方法中,並從rake調用該方法。下面是一個例子:

class League 
    def self.save_fixtures_to_db 
    # Your ruby code here. 
    end 
end 

然後rake任務調用這個方法。這樣可以避免重新加載環境(正如您在任務中成功引用聯盟所看到的那樣)。

另一種選擇是在您編寫的腳本中加載Rails。如果無法將代碼移動到Rails方法中,您可以將binstubs的前幾行(bin/rails和bin/rake)複製到您自己的文件中。

另外,你看看db:fixtures:load Rails內置,看看是否會滿足您的需求?

+0

這非常合理!我不知道爲什麼這對我不明顯。非常感謝。是的,'get_fixtures.rb'不需要Rails環境,就像你在代碼中看到的一樣。但是,'save_fixtures_to_db.rb'確實。 至於內置'db:fixtures:load',這些是足球聯賽的裝置,而不是樣本數據。 – RuppalSingh

0

而不是,例如,bundle exec ruby "#{Rails.root}/lib/tasks/get_fixtures.rb"嘗試bundle exec rails runner "#{Rails.root}/lib/tasks/get_fixtures.rb"

+0

我收到以下錯誤:'rake中止了! NoMethodError:undefined method'runner'for main:Object' – RuppalSingh

相關問題