我有一个数组作为哈希的值:
:params=>[":centre_id", ":id"]
我试图找到一种方法将数组的每个元素转换为这样的东西:
:centre_id => 1
:id => 1
我尝试了许多不同的方法,但我似乎无法找到一个很好的干净方法:
"#{route[:params].map {|x| x.parameterize.underscore.to_sym => '1'}}"
这就是我想要实现的目标:
-{"controller"=>"venues", "action"=>"activity, {:centre_id=>1, :id=>1}"}
+{"controller"=>"venues", "action"=>"activity", "centre_id"=>"1", "id"=>"1"} << this one
string or symbol doesn't matter does it?
使用此:
expect(route[:request_method] => route[:path]).to route_to "#{route[:controller]}##{route[:action]}, #{Hash[route[:params].map {|x| [x.sub(/\A:/,'').to_sym, 1] }]}"
非常感谢帮助。
答案 0 :(得分:4)
执行以下操作: -
route[:params].map {|x| [x.sub(/\A:/,'').to_sym, 1] }.to_h
# => {:centre_id => 1, :id => 1}
Hash[route[:params].map {|x| [x.sub(/\A:/,'').to_sym, 1] }]
# => {:centre_id => 1, :id => 1}
答案 1 :(得分:1)
如果
h = { :params=>[":centre_id", ":id"], :animals=>[":dog", ":cat", ":pig"] }
以下其中一项可能会有所帮助:
h.merge(h) { |_,v,_| Hash[v.map { |s| [s[1..-1].to_sym,1] }] }
#=> {:params=>{:centre_id=>1, :id=>1}, :animals=>{:dog=>1, :cat=>1, :pig=>1}}
或
Hash[h.keys.map { |k| h.delete(k).map { |s| [s[1..-1].to_sym,1] } }.flatten(1)]
#=> {:centre_id=>1, :id=>1, :dog=>1, :cat=>1, :pig=>1}
第二个修改h
。如果您不希望这种情况发生,则首先需要h.dup
。
如果a
是一个数组,则可以使用Ruby 2.1 +将Hash[a]
替换为a.to_h
。