Как получить данные из хэша? - PullRequest
1 голос
/ 25 августа 2009

Учитывая этот хеш, который приходит, хотя: 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)

Ответы [ 4 ]

13 голосов
/ 25 августа 2009

Я думаю, что вы хотите

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

Если вас не интересуют индексы, вы также можете просто использовать params[:positions].values.each do |coords|.

3 голосов
/ 25 августа 2009

Вы можете сделать что-то вроде этого:

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"}). В этих хешах ваши ключи являются строками, поэтому вам нужно заглянуть внутрь этих хешей с помощью строковых ключей.

1 голос
/ 25 августа 2009

Я думаю, что вы ищете позицию [x] вместо position.x.

0 голосов
/ 25 августа 2009

Если вы используете Enumerable #, каждый из которых имеет хэш, вам нужно захватить две переменные блока (это «разворачивает» массив ключ / значение в две отдельные переменные). Кроме того, Ruby не использует точечный синтаксис для хэшей (это не Javascript).

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

Это избавляет вас от необходимости сначала собирать массив значений (используя значения Hash #).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...