Получение NoMethodError (неопределенный метод) для каждого существующего свойства - PullRequest
0 голосов
/ 21 февраля 2019

Если я введу movie = Movie.limit(1) в консоль, я получу

SELECT  "movies".* FROM "movies" LIMIT $1  [["LIMIT", 1]] => #<ActiveRecord::Relation [#<Movie id: 2, title: "Superman", rating: "PG", total_gross: 0.134218018e9, created_at: "2019-02-20 07:42:18", updated_at: "2019-02-20 08:17:24", description: "Clark Kent grows up to be the greatest super-hero", released_on: "1978-12-15">]>

Однако, если я введу movie.title, вместо "Супермена" я получу:

Traceback (most recent call last):
    1: from (irb):2
Movie Load (0.6ms)  SELECT  "movies".* FROM "movies" LIMIT $1  [["LIMIT", 1]]
NoMethodError (undefined method `title' for #<Movie::ActiveRecord_Relation:0x000055b334842668>)

Потратил последние три часа на поиски причины, но безрезультатно.

РЕДАКТИРОВАТЬ: Мой класс имеет метод:

def index
  @movies = Movie.all
end

Но когда я вызываю его из представления индекса, ни один изсвойства работают:

<% @movies.each do |f| %>
  f.title
<% end %>

ArgumentError в Фильмах # index

ОБНОВЛЕНИЕ: В моей базе данных была пустая строка, возвращающая ноль для каждого свойства.Удаление этой строки устранило проблему.

1 Ответ

0 голосов
/ 21 февраля 2019

При применении limit к унаследованному классу ApplicationRecord вы получаете ActiveRecord_Relation, другими словами, коллекцию (массив) различных объектов, принадлежащих этой конкретной модели.

объясняет ошибку, которую вы получаете, title недоступен в качестве метода для Movie::ActiveRecord_Relation, но это относится к объекту Movie, поэтому, тем не менее, вам необходим дополнительный шаг, то есть доступ к определенной записиот результата ограничения.

movie = Movie.limit(1).first

Это сработало бы, это разумно, если предел больше 1, но вы также можете увидеть take и / или first (оба также могут получить количество записей для запроса).

...