Подтвердить что ты не робот

Как передать массив в качестве аргумента для задачи Rake?

Я пишу задачу 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?

4b9b3361

Ответ 1

Одна из причин состоит в том, чтобы избежать символа , в строке, поэтому ваша командная строка будет выглядеть так:

$ rake change_statuses['1 2 3', foo, bar]

Затем вы можете просто разделить идентификаторы:

# 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

Ответ 2

rake "change_statuses[1 2 3, foo, bar]"

это работает для меня, вы не должны использовать квоту 1 2 3 с помощью

task :import_course, [:cids, :title] => :environment do |t, args|
  puts args[:cids]
end

если в качестве правильного ответа вы укажете 1 2 3, args [: cids] будет "1 2 3", в который включен ' char, вы должны обрезать ' char, но если вы используете мой ответ, args [: cids] будет "1 2 3", что проще в использовании, вам просто нужны аргументы [: cids].split(""), чтобы получить [1, 2, 3]

Ответ 3

Еще один способ добиться этого, а также выиграть способность передавать хэш

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

И просто вызовите грабли следующим образом:

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"}}

Ответ 4

Вы можете сделать это как альтернативу:

 task :my_task, [:values] do |_task, args|
   values = args.values.split(',')
   puts values
 end

и запустите задачу, используя

rake my_task"[1\,2\,3]"