Rakeタスクを作成していて、引数の1つとして配列を渡したいと思います。これが私が現在持っている方法です。
task :change_statuses, :ids, :current_status, :new_status do |task, args|
puts "args were #{args.inspect}"
end
私はこれらの方法でタスクを実行しようとしました:
# First argument as array
rake "change_statuses[[1,2,3], active, inactive]"
# First argument as string
rake "utility:change_account_statuses['1,2,3', foo, bar]"
私の期待される出力は次のようになります:
args were {:ids=> [1,2,3], :current_status=> 2 , :new_status=> 3}
ただし、それぞれの場合のactual出力は次のとおりです。
args were {:ids=>"[1", :current_status=>"2", :new_status=>"3]"}
配列をRakeタスクに渡すにはどうすればよいですか?
解決策の1つは、文字列内の,
記号を回避することです。そのため、コマンドラインは次のようになります。
$ rake change_statuses['1 2 3', foo, bar]
次に、IDを簡単に分割できます。
# Rakefile
task :change_statuses, :ids, :current_status, :new_status do |task, args|
ids = args[:ids].split ' '
puts "args were #{args.inspect}"
puts "ids were #{ids.inspect}"
end
または、ids値を解析して、期待される出力を取得することもできます。
args[:ids] = args[:ids].split(' ').map{ |s| s.to_i }
私はレーキ0.8.7を使用しています
rake "change_statuses[1 2 3, foo, bar]"
これは私にとってはうまくいきます、あなたは 'で123を割り当てるべきではありません
task :import_course, [:cids, :title] => :environment do |t, args|
puts args[:cids]
end
正解として12 3を割り当てた場合、args [:cids]は "'1 2 3'"になり、'
charが含まれているため、'
charをトリミングする必要がありますが、私の答え、args [:cids]は "1 2 3"になります。これはより使いやすく、[1、2、3]を取得するにはargs [:cids] .split( "")が必要です。
これを達成し、ハッシュを渡す機能を獲得する別の方法
namespace :stackoverflow do
desc "How to pass an array and also a hash at the same time 8-D"
task :awesome_task, [:great_attributes] do |task, args|
options = Rack::Utils.parse_nested_query(args[:attributes])
puts option
end
end
そして、次のようにrakeタスクを呼び出すだけです。
bundle exec rake "player_rules:awesome_task[what_a_great_key[]=I know&what_a_great_key[]=Me too\!&i_am_a_hash[and_i_am_your_key]=what_an_idiot]"
そしてそれは印刷されます
{"what_a_great_key"=>["I know", "Me too!"], "i_am_a_hash"=>{"and_i_am_your_key"=>"what_an_idiot"}}
別の方法としてこれを行うことができます。
task :my_task, [:values] do |_task, args|
values = args.values.split(',')
puts values
end
を使用してタスクを実行します
rake my_task"[1\,2\,3]"