2009-08-24 115 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#值)。