どなブロ

Ruby, Rails, Python, 機械学習, その他気になったこととか思ったこととか

【Rails】rakeタスクに引数を与える & ソース上での実行

おひさです。

rakeタスクに引数を与えたくて調べました。
あとModelでちょっとタスクを実行したくてそっちも調べました。

引数の与え方

タスク引数(?)

名前が合ってるかわからんですが[]で渡すようにするやり方

namespace :hogehoge do
  task :run, ['hoge', 'fuga'] => :environment do |task, args|
    puts args.hoge
    puts args.fuga
  end
end
# 実行
$ rails hogehoge:run["ほげ", "ふが"]
ほげ
ふが

ちなみに引数指定しないとnilが入るみたいです。

環境変数

コマンドライン引数で環境変数を指定してあげる感じ

namespace :hogehoge do
  task run: :environment do
    puts ENV['hoge']
  end
end
# 実行
$ rails hogehoge:run hoge="ほげえ"
ほげ

こっちも指定しないとnilになるみたい。

ソース上での実行

あんまりよくないやり方かもしれない。

require 'rake'
Rails.application.load_tasks
Rake::Task['タスク名'].execute # もしくは.invoke
Rake::Task['タスク名'].clear

最後にclearしないと同じ箇所を通った際に再度load_tasksされてexecuteで二回実行されてしまう。
.execute.invokeでは引数の扱いに違いがあるらしい。詳しくは以下参照
rakeタスク内で別のタスクを呼び出す - Qiita

参考

Ruby on Rails | Rakeタスクに引数を渡す - Tbpgr Blog
rakeタスクに引数を与える | 毒男日記
RailsでRakeタスクをcontrollerから呼び出す時の覚書 - Qiita