@zggb

Ассоциации в полиморфных связях?

Здравствуйте!
Имеется
class Location < ActiveRecord::Base
  belongs_to :locatable, polymorphic: true

class RealEstate < ActiveRecord::Base
  has_one :location, as: :locatable, dependent: :destroy


Если в контроллере четко задавать RealEstate
@real = RealEstate.find(params[:id])
Тогда ассоциации вида
@real.location.address
отлично работают

Проблема возникает когда в контроллере
@user = current_user
@real = @user.real_estates

или
@real = RealEstate.all
и используются партиалы,
<%= render @users %>
<%= render partial: '/real_estates/real_estate', collection: user.real_estates %>

Тогда, использование
<%= real_estate.location.address %>
выдает ошибку undefined method `address' for nil:NilClass
хотя, если оставить
<%= real_estate.location %>
то во вьюхе будет показан объект в виде Location:0x007fd2c9d37018

Как правильно обратиться к параметрам объекта Location? Заранее благодарю!
  • Вопрос задан
  • 2247 просмотров
Решения вопроса 1
@Renius
дурак восторженный
Вы нас или себя где-то обманываете.
Руби очень хорошо отличает объекты разных классов. Редки те случаи когда Location:0x007fd2c9d37018 вдруг становится nil-ом.

Однако, если вы рендерите коллекцию, то возможно в этой коллекции есть estate с location nil, который и вызывает ошибку.

если вы используете конструкцию вроде
real_estate.location.address if real_estate.location

или
real_estate.location.try(:address)
то легко найдете искомый объект

С другой сторы, чтобы такого не происходило, валидируйте
validates :location, presence: true
чтобы данные всегдабыли в валидном состоянии
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
viktorvsk
@viktorvsk
А адрес у вас точно - простой эктив рекорд аттрибут?
С ассоциациями что-то похожее бывает, когда вы через них, например, хотите обратиться к несуществующему атрибуту, но который у вас автоматически генерируется в method missing.

Еще такое бывает, например, если сделаешь скоуп или просто -
Location.select(:id), тогда метода address не будет

Пробуйте добиться такого поведения в консоли. Смотрите класс получаемого объекта, смотрите, как уже спросили - attributes. Пробуйте в метод, который "работает" (to_s, например) передать то, что не работает. Например:
def to_s
"Вот и #{address}"
end
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы