簡體   English   中英

為什么Rake任務中的這個Ruby腳本不會選擇Rails環境?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM