9

我有一个 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"},{}]

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

我们是否不允许将哈希传递给 rake 任务?

4

3 回答 3

14

我使用类似查询字符串的参数并用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"}}
于 2013-09-17T13:35:16.817 回答
1

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

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

这并不意味着编写 rake 任务的人没有做一些聪明的事情来将字符串解析为哈希。如果我是您并试图弄清楚,我会查看源代码并查看该 rake 任务如何解析它的变量。

PS。如果它是您正在使用的 gem,并且您也在使用 bundler,您可以发出bundle open gem_name打开源代码,rake 任务通常以 .rake 结尾...

于 2012-05-09T22:00:54.753 回答
0

尝试将任务中的 :p 变量声明为哈希?:p => {}

任务 :post_hit, [:host, :title, :description, :model, :num_assignments, :reward, :lifetime, :qualifications, :p => {}, :opts

于 2012-05-09T21:06:39.947 回答