2015-12-29 2 views
2

У меня есть рельсы 4 приложения.Rails - Ассоциации

У меня есть модель профиля и модель организации.

Ассоциации являются:

profile.rb:

belongs_to :organisation 

organisation.rb

has_many :profiles 

Тогда в моем шоу-странице в моей папке профилей, у меня есть:

<% unless @profile.organisation.title.empty? %> 
    <%= @profile.organisation.title %> 
<% end %> 

Когда я попробуйте это, я получаю ошибку метода:

undefined method `title' for nil:NilClass 

Я не понимаю эту ошибку. Если нет названия, то ничего не видно.

Может ли кто-нибудь увидеть, что я сделал неправильно?

Принимая Мили предложение ниже, я попытался изменить свои профили показать страницу:

<% unless Organisation.find(@profile.organisation_id).title.empty? %> 
        <%= Organisation.find(@profile.organisation_id).title %> 
       <% end %> 

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

Couldn't find Organisation with 'id'= 

Строка, начинающаяся с „если“ не будет выделена сообщение об ошибке

ответ

1

organization вашего profile instance - nil, поэтому, когда @ profile.organization.title называет это фактически вызовом nil.title и бросает ошибку (undefined method названия»для ноля: NilClass`)

Вы можете использовать try преодолеть в уровне представления

<%= @profile.organisation.try(:title) %> 

Или вы можете дать проверку правильности преодоления nil на title колонки на уровне

модели на модели организации

class Organisation < ActiveRecord::Base 
    validates :title, prescence: true 
end 
+1

Это правильный ответ! Пожалуйста, попробуйте это @ user2860931 – nathanvda

+0

Привет, я попробовал это. Я получаю ту же ошибку, что и до того, как я это пробовал. Я думаю, что это имеет какое-то отношение к точке, которую Майлз сделал ниже. – Mel

+0

Хотя Майлз, кажется, удалил свой ответ – Mel

0
<%= @profile.try(:organisation).try(:title) %> 

Docs.


Реальная проблема заключается в том, что ваш @profile, кажется, не имеют связанный organization.

Это может быть решено несколькими способами; Я бы лично use a validation, чтобы убедиться, что ваш organization заселяется с каждым profile создания:

#app/models/profile.rb 
class Profile < ActiveRecord::Base 
    belongs_to :organisation 
    validates :organisation, presence: true 
end 

Конечно, это не будет решить текущие проблемы.

Чтобы решить, что вам нужно, чтобы убедиться, что ваш organisation_idforeign key заполняется с правильной ссылкой на Organization модели:

$ rails c 
$ profile = Profile.find [[your id]] 
$ profile.update organisation_id: [[org_id]] 
$ exit 

Если вы получите это работает, крутой трюк вы можете использовать это delegate:

#app/models/profile.rb 
class Profile < ActiveRecord::Base 
    belongs_to :organisation 
    validates :organisation, presence: true 
    delegate :title, to: :organisation, prefix: true #-> @profile.organisation_title 
end 

Делегат, как следует из названия, берет ваш запрос и отправляет его через к зависимым класс. Он отлично работает с belongs_to, потому что он устраняет необходимость ссылки на ассоциативный объект между родительским и зависимым классами.

+0

Привет, Rich. Я пробовал так, как вы предлагали. Я часто использую это для полей, которые не могут быть заполнены, но на этот раз они не работают. Я не пытаюсь заставить профиль иметь организацию. Я хочу, чтобы он показывал организацию, если она есть. Существует внешний ключ в моей модели профиля для organisation_id. – Mel

+0

Я собираюсь попробовать сделать это полиморфным и посмотреть, подходит ли другой подход для меня лучше – Mel

Смежные вопросы