Найти по ошибке nil объекта в рельсах - PullRequest
1 голос
/ 27 декабря 2010

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

DiscoveredLocation.find_by_user_id(user.id, :include => [:boss_kills])

Модели:

DiscoveredLocation(id, user_id, boss_location_id)
BossKill(user_id, monster_id)

и ассоциации:

Monster belongs_to :boss_location
Monster has_many :boss_kills

BossKill belongs_to :user
BossKill belongs_to :monster


DiscoveredLocation belongs_to :user
DiscoveredLocation  belongs_to :boss_location

DiscoveredLocation  has_many :monsters, :through => :boss_location

DiscoveredLocation  has_many :boss_kills, :through => :monsters

Когда я выполнил find_by, я получил этоошибка:

NoMethodError in BossesController#index

You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each

Если я изменю опцию включения на любую другую модель, например: monster, она прекрасно работает.Я в значительной степени принадлежу этой проблеме: P.Может кто-нибудь может мне помочь?:)

Ответы [ 3 ]

0 голосов
/ 27 декабря 2010

Вам также необходимо включить промежуточные таблицы, иначе невозможно сопоставить boss_kills с DiscoveredLocations:

DiscoveredLocation.find_by_user_id(user.id, :include => [:monsters, :boss_locations,:boss_kills])

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

0 голосов
/ 27 декабря 2010

Модель DiscoveredLocation пытается определить вложенные has-many посредством ассоциации:

DiscoveredLocation  has_many :monsters, :through => :boss_location
DiscoveredLocation  has_many :boss_kills, :through => :monsters

Я не верю, что ActiveRecord может сделать это из коробки. Существует плагин nested_has_many_through , который утверждает, что поддерживает это - я понятия не имею, будет ли он работать в этом случае.

Дополнительную информацию можно найти здесь и здесь

0 голосов
/ 27 декабря 2010

Я могу ошибаться, но чтобы помочь вам, попробуйте DiscoveredLocation.find_by_user_id(user.id, :include => [:boss_kill])

Наконец, вы уверены, что передаете переменную с именем user в контроллер?возможно current_user, если вы используете популярный гем аутентификации?

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