[英]Why won't this Ruby script in a Rake task pick up the Rails environment?
我編寫了一個Ruby腳本,我想將其作為Rake任務運行。 以下是我的data.rake
文件:
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
任務,注釋行正常工作並將聯盟數據顯示為ActiveRecord查詢,而Ruby腳本在使用其中的League.new
時拋出以下錯誤:
`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/ruby-2.2.1@havenprediction/bin/ruby_executable_hooks:15:in `eval'
/home/fred/.rvm/gems/ruby-2.2.1@havenprediction/bin/ruby_executable_hooks:15:in `<main>'
Tasks: TOP => data:fixtures:db
(See full trace by running task with --trace)
我迷失在這里。 我不知道為什么環境只在rake任務中可用,而不是rake任務中的Ruby腳本。
環境僅在rake任務中可用,而不是rake任務中的Ruby腳本,因為您構建了Rake調用的方式。 您正在開始一個額外的過程(需要加載環境本身以“回到”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方法中,則可以將binstub的前幾行(bin / rails和bin / rake)復制到您自己的文件中。
另外,你看過db:fixtures:load
內置的Rails是否能滿足你的需求?
而不是,例如, bundle exec ruby "#{Rails.root}/lib/tasks/get_fixtures.rb"
嘗試bundle exec rails runner "#{Rails.root}/lib/tasks/get_fixtures.rb"
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.