Почему я получаю эту TypeError - «не могу преобразовать символ в целое число»? - PullRequest
3 голосов
/ 21 декабря 2010

У меня есть массив хэшей. Каждая запись выглядит так:

- !map:Hashie::Mash 
  name: Connor H Peters
  id: "506253404"

Я пытаюсь создать второй массив, который содержит только значения идентификатора.

["506253404"]

Вот как я это делаю

second_array = first_array.map { |hash| hash[:id] }

Но я получаю эту ошибку

TypeError in PagesController#home
can't convert Symbol into Integer

Если я попытаюсь

second_array = first_array.map { |hash| hash["id"] }

Я получаю

TypeError in PagesController#home
can't convert String into Integer

Что я делаю не так? Спасибо за чтение.

Ответы [ 2 ]

6 голосов
/ 21 декабря 2010

Вы используете Hashie, который отличается от Hash от ruby ​​core.Глядя на репозиторий Hashie github , кажется, что вы можете получить доступ к хеш-ключам в качестве методов:

first_array.map { |hash| hash.id }

Попробуйте это и посмотрите, работает ли это - убедитесь, что это не работаетвернуть object_id.Таким образом, вы можете перепроверить, выполнив first_array.map { |hash| hash.name }, чтобы увидеть, действительно ли вы обращаетесь к нужным данным.

Затем, если это правильно, вы можете использовать процедуру для получения идентификатора (нос немного большей краткостью):

first_array.map(&:id)
0 голосов
/ 21 декабря 2010

Похоже, что внутри блока карты хэш на самом деле не является хэши - это массив по какой-то причине.

В результате метод [] на самом деле является методом доступа к массиву и требует целое число.Например.хеш [0] будет действительным, но не хеш ["id"].

Вы можете попробовать:

first_array.flatten.map{|hash| hash.id}

, который обеспечит удаление вложенных массивов, если у вас есть вложенные массивы.

Или, возможно,

first_array.map{|hash| hash.id if hash.respond_to?(:id)}

Но в любом случае вы можете столкнуться с неожиданным поведением.

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