我正在写一个Rake任务,我想传递一个数组作为其中一个参数。这是我目前的方式。
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}
但是,我的实际输出在每种情况下都是:
args were {:ids=>"[1", :current_status=>"2", :new_status=>"3]"}
如何将数组传递给Rake任务?
答案 0 :(得分:33)
其中一个问题是避免在字符串中使用,
符号,因此您的命令行将如下所示:
$ 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
或者您可以解析id值以获得预期的输出:
args[:ids] = args[:ids].split(' ').map{ |s| s.to_i }
我正在使用rake 0.8.7
答案 1 :(得分:0)
rake "change_statuses[1 2 3, foo, bar]"
这适用于我,你不应该用'
配额1 2 3task :import_course, [:cids, :title] => :environment do |t, args|
puts args[:cids]
end
如果您将配额1 2 3作为正确答案,则args [:cids]将为"' 1 2 3'",其中包含'
字符,您必须修剪'
字符,但是如果你使用我的答案,args [:cids]将是" 1 2 3",这更容易使用,你只需要args [:cids] .split("")获得[1,2,3]
答案 2 :(得分:0)
另一种实现此目标并获得传递哈希值的能力的方法
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"}}
答案 3 :(得分:0)
您可以作为替代方法:
task :my_task, [:values] do |_task, args|
values = args.values.split(',')
puts values
end
并使用
运行任务rake my_task"[1\,2\,3]"