2009-08-24 116 views
1

鉴于这种哈希自带虽然:PARAMS如何从散列中获取数据?

"positions"=>{ 
    "1"=>{"x"=>"50", "y"=>"30"}, 
    "2"=>{"x"=>"22", "y"=>"53"}, 
    "3"=>{"x"=>"68", "y"=>"35"} 
} 

我将如何做到这一点? (不工作,而是试图证明什么,我想要做的)

params[:positions].each do |position| 
    logger.info(position.x) 
end 

我知道,痛苦初学者的东西...

我得到一个NoMethodError (undefined method 'x' for ["1", {"x"=>"50", "y"=>"30"}]:Array)

回答

13

我想你想要的是

params[:positions].each do |index, coords| 
    logger.info(coords['x']) 
end 

如果你不关心的指标,你也可以只使用params[:positions].values.each do |coords|代替。

+0

这是您正在寻找的答案。 – 2009-08-24 20:28:23

1

我认为你在寻找对于position [x]而不是position.x。

+0

之前也试过,“未定义的局部变量或方法'x'为#” – 2009-08-24 20:08:31

+0

其实,位置['x']就是你在这种情况下要找的东西。 – 2009-08-25 18:49:42

3

你可以做这样的事情:

positions = { 
    "1"=>{"x"=>"50", "y"=>"30"}, 
    "2"=>{"x"=>"22", "y"=>"53"}, 
    "3"=>{"x"=>"68", "y"=>"35"} 
} 

positions.each_value do |hash| 
    logger.info(hash['x']) 
end 

each_value方法拉出哈希值(例如{"x"=>"50", "y"=>"30"})。在这些哈希中,你的键是字符串,所以你需要用弦键来查看这些哈希。

0

如果你使用Enumerable#和Hash,你需要捕获两个块变量(这个“解开”key/value的数组成两个不同的变量)。此外,Ruby不使用散列的点语法(这不是Javascript)。

some_hash.each do | (key, value) 
    puts value["x"] 
end 

这可以避免首先组装一个值的数组(使用Hash#值)。