将哈希作为参数传递给Rake任务

10
我有一个 rake 任务。
task :post_hit, [:host, :title, :description, :model, :num_assignments, :reward, :lifetime, :qualifications, :p, :opts] => :environment do |t, args|

:p 需要是一个哈希值,但如果我尝试:

rake turkee:post_hit["http://www.staging.collegesportsbluebook.com","LS Info","Fill In Player First Name","MechanicalTurk",100,0.01,2,{},{id: 5},{}]

它报错说无法解析“id:”(似乎是空格起了作用)。如果我尝试:
rake turkee:post_hit["http://www.staging.collegesportsbluebook.com","LS Info","Fill In Player First Name","MechanicalTurk",100,0.01,2,{},{"id: 5"},{}]

整个字符串"id: 5"被解释为单个字符串。

我们不能将哈希传递给rake任务吗?

3个回答

17

我使用类似于查询字符串的参数,并使用Rack::Utils.parse_nested_query进行解析。

这是我的做法:

require 'rack/utils' # needed for Rack::Utils.parse_nested_query

namespace :foo do
  task :bar, [ :args_expr ] => :environment do |t, args|
     args.with_defaults(:args_expr => "name=abdo&fruits[]=bananas&fruits[]=dates")
     options = Rack::Utils.parse_nested_query(args[:args_expr])

     puts options
  end
end

我这样调用它:(注意如何传递数组和哈希)

bundle exec rake "foo:bar[name=abdo&fruits[]=apples&fruits[]=oranges&hash[foo]=bar&hash[cool]=notmuch]"

输出:

{"name"=>"abdo", "fruits"=>["apples", "oranges"], "hash"=>{"foo"=>"bar", "cool"=>"notmuch"}}

envied gem可以做类似的事情,支持:hash类型(例如将'a=1&b=2'转换为{'a' => '1', 'b' => '2'})。 - gabe

2
当您通过终端发出rake任务时,您处于UNIX或Bash环境中,因此您需要遵守该语言的规则,据我所知,其中不包括哈希。不过我可能是错的。

http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html#toc5

这并不意味着编写rake任务的人没有做一些聪明的事情来将字符串解析为哈希。如果我是你,想要弄清楚这个问题,我会查看源代码,看看那个rake任务如何解析它的变量。
另外,如果你正在使用一个gem,并且也在使用bundler,你可以发出bundle open gem_name命令来打开源代码,rake任务通常以.rake结尾...

0

尝试在任务中声明你的 :p 变量为 hash 类型,例如::p => {}

任务 :post_hit 包含以下参数:[:host, :title, :description, :model, :num_assignments, :reward, :lifetime, :qualifications, :p => {}, :opts]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接