タグ別アーカイブ: arguments

[rails]Rakeタスクでのtask定義の「:environment」引数について


Railsのジェネレータで生成したタスクのrbファイルを見ているとRakeタスクを定義するところで少し疑問に思ったことがあった。

railsのジェネレーターで以下のとおりにタスクを作成する。

% rails generate TASK_FILE_NAME TASK_NAME

例)
% rails generate hoge test

例)のように実行すると lib/tasks/hoge.rb ができて testというタスクが定義される

namespace :hoge do
  desc "TODO"
  task test: :environment do
  end
end

タスク定義のところで「:environment」 という引数が渡されているが、どういうこのことなのかを調べてみた。

「RailsでオリジナルRakeタスク作成からRSpecテストまで」 の記事の中に以下の一文があったので実際に試してみる。

:environment は モデルにアクセスするのに必須

引用:RailsでオリジナルRakeタスク作成からRSpecテストまで


lib/tasks/hoge.rb を以下のように変更する。

(Userモデルのデータは別途用意していることが前提)

  1. testタスク :environmentの引数を渡さない
  2. test_twoタスク :environmentの引数を渡す
namespace :hoge do
  desc "does not huve environment args"
  task :test do
    puts User.first
  end

  desc "has environment args"
  task test_two: :environment do
    puts User.first
  end
end

それぞれを実行する

  • 1.testタスク :environmentの引数を渡さない
% rake hoge:test
rake aborted!
uninitialized constant User
…省略

=> なんか「uninitialized constant User」という例外でエラーになる。


  • 2.test_twoタスク :environmentの引数を渡す
% rake hoge:test_two
# <User:0x007fadd5f68a80>

=> ちゃんとユーザを取得できている

まとめ

RailsでRakeタスクを使ってActiveRecordのモデルなどを扱うときは 「:environment」引数を渡して上げると良い!

さらに、実行時にもenvironmentを呼ぶことが出来るようだ

rakeタスク実行時に environment をよんでから hoge:test を呼ぶ

% rake environment hoge:test

コードは読んでなく検証しただけなので、もっと詳しくは調べないとなー