Массив Ruby on rails - неявное преобразование символа в целое число - PullRequest
0 голосов
/ 04 октября 2018

Я сделал компонент таблицы, используя реагировать js, который использует столбцы для отображения данных (который отлично работает с другими данными).Например, в столбце 1 будет отображаться заголовок, в столбце 2 - год, а в столбце 3 - формат.

Вот пример моего JSON:

{"movies": [{"title": "Iron Man", "year": "2008", "format": "DVD"}, {"title": "Iron Man 2", "year": "2010", "format": "DVD"}, {"title": "Iron Man 3", "year": "2013", "format": "DVD"}]}

Вот мой код для заполнениятаблица, но она, похоже, не работает:

@movieList = #Makes a call to my mock API to get list of movies
@movies = Array.new

@movieList.each do |item|
 @movie = Hash.new
 @movie[:column1] = item[:title]
 @movie[:column2] = item[:year]
 @movie[:column3] = item[:format]
 @movies << @movie
end

Мне нужен совет, чтобы преодолеть «неявное преобразование символа в целочисленную ошибку», которое я получаю.Кто-нибудь может дать какой-нибудь совет и указать, где я иду не так?

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

tl; др

использование @movieList["movies"].each

объяснение

Проблема в том, что вы действуете какхотя ваш @movieList представляет собой массив ann , на самом деле это хеш (при условии, что @movieList - это JSON, который вы показали).

each работает наи массивы и хэши.Однако, когда вы используете его для хэша, блок передается |key, val|.Кроме того, присвоение блочных переменных не является обязательным.Итак, когда вы говорите, @movieList.each do |item|, item на самом деле является ключом верхнего уровня хеша («кино»).

Строки, такие как "фильмы", отвечают на [] индексацию с числами .Вот почему вы получаете ошибку no implicit conversion of symbol into integer ... потому что вы передаете символ String#[], и он ожидает целое число.

Другой способ написания этого кода, более идиоматический, будет выглядеть так:

@movies = @movieList["movies"].map do |movie|
  {
    column1: movie["title"],
    column2: movie["year"],
    column3: movie["format"]
  }
end
0 голосов
/ 05 октября 2018

Вам нужно зациклить фильмы, используя @movieList["movies"], так как ваш JSON - это хеш, который имеет значение ключа 'movies' и массив фильмов в качестве значения => {'movies': [{...},{...},...]}

Как @max pleaner объяснил назначениепеременные блока не обязательны, но когда вы используете each для хэша (в данном случае это JSON) и предоставляете только одну блочную переменную (вместо двух ссылок на ключи и значения хэша), ваши пары ключ-значение преобразуютсядля двухэлементных массивов внутри блока, где первый элемент является ключом, а второй - значением пары.

Ваш item выглядит так внутри каждого вашего блока - ['movies', [{movie1}, {movie2},..]], следовательно:

item[0] # 'movies'
item[1] # [{movie1}, {movie2},...]

Поскольку массивы ожидают индексации с целыми числами и вы вводите символ (item[:title]), вы получаете:

TypeError (no implicit conversion of Symbol into Integer)
0 голосов
/ 04 октября 2018

попробуйте переназначить

@movieList = @movieList[:movies], это решит вашу проблему.Вы пытаетесь перебрать объект вместо массива.

Дай мне знать, решит ли он вашу проблему.

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