概要
railsのタスクですが、引数が必要な時とか、他のtaskを事前に実行したい時に、task
メソッドに渡す引数の書き方がいつもわからなくなって毎回検索するのでまとめておきます。
引数無し・別のタスク実行無し
素のタスクです。引数はtaskの名前のみ。
desc '引数無し・別のタスク実行無し'
task :some_task do |task, args|
puts 'some_task'
end
引数あり・別のタスク実行無し
引数だけあるパターン。二番目の引数に配列で列挙可能。
desc '引数あり・別のタスク実行無し'
task :some_task, [:arg1, :arg2] do |task, args|
p args
end
呼び出す時はrails some_task[foo,bar]
。task内ではargs.arg1
、args.arg2
で参照できます。
ちなみに一つの時は配列にしなくてもOK。
desc '引数あり・別のタスク実行無し'
task :some_task, :arg1 do |task, args|
p args
end
引数無し・別のタスク実行あり
taskに渡す最初の引数がhashになります。キーが名前で値が実行したいタスク。この辺から???って感じです。
desc '引数無し・別のタスク実行あり'
task some_task: [:environment, 'another_task'] do |task, args|
p User.class
end
こちらも同じく一つの時は配列にしなくてもOK。
desc '引数無し・別のタスク実行あり'
task some_task: :environment do |task, args|
p User.class
end
引数あり・別のタスク実行あり
引数が二つになり、二番目の引数に引数の配列をキーにしたハッシュを渡します(もう何を言ってるかわかりません)。
desc '引数あり・別のタスク実行あり'
task :some_task, [:foo, :bar] => [:environment] do |task, args|
p User
p args
end
実行したいタスクが一つの時は配列じゃなくてもOKですが、引数は配列じゃないとダメです。
desc '引数あり・別のタスク実行あり'
task :some_task, [:foo] => :environment do |task, args|
p User
p args
end
ふむ・・・改めてまとめてみると結構わかりづらいですね。覚えられないわけだ。
下記のような引数ならわかりやすいのに。
# このコードは動きません!
task :some_task, args: [:foo], before: [:environment] do |task, args|
p User
p args
end