2011-12-02 2 views
1

두 모델, 방문 및 사용자가있는 레일 앱이 있습니다. 방문에는 2 명의 사용자가 있습니다. 컨트롤러 및 엔지니어. 관계를 다음과 같이 설정했지만 어떤 이유로 인해 관련 사용자의 속성에 액세스 할 수 없습니다. 내가 궁리하고있어?관련 모델의 변수에 액세스 할 수 없습니다.

방문 모델

class Visit < ActiveRecord::Base 
    belongs_to :engineer, :class_name => "User", :foreign_key => 'engineer_id' 
    belongs_to :controller, :class_name => "User", :foreign_key => 'controller_id' 
end 

사용자 모델

class User < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable 
    attr_accessible :email, :password, :password_confirmation, :remember_me 

    has_many :engineer_visits, :class_name => "Visit", :foreign_key => "engineer_id" 
    has_many :controller_visits, :class_name => "Visit", :foreign_key => "controller_id" 
end 

방문 인덱스보기

<% @visits.each do |visit| -%> 
    <%= visit.visit_date.strftime("%a %d/%m/%Y") %> 
    <%= visit.engineer.email %> 
<% end -%> 

이 wher입니다 나는 이메일 속성이있는 <%= debug visit.engineer %>을 인쇄 할 경우

NoMethodError in Visits#index 
... 
undefined method `email' for nil:NilClass 

을하지만 실제로 개인의 표시 속성을 얻을 수없는 다음을 제외하고, 실패 전자.

어떻게 이러한 변수에 액세스 할 수 있습니까?

답변

1

엔지니어가 아닌 컨트롤러를 방문하면 오류가 표시 될 수 있습니다.

처럼보기를 수정하십시오 : 당신의 관계가 제대로 작동하지 않는 것처럼

<% @visits.each do |visit| -%> 
    <%= visit.visit_date.strftime("%a %d/%m/%Y") %> 
    <%= visit.engineer.email unless visit.engineer.nil? %> 
    <%= visit.controller.email unless visit.controller.nil? %> 
<% end -%> 
+1

감사합니다. Tudor. 항상 바보 같은 짓이야! 내 목록에 두 번째 방문에 엔지니어와 컨트롤러를 추가하는 것을 잊어 버렸습니다. 이러한 검사를 추가하면 어느 것이 누락되었는지 쉽게 알 수 있습니다. 유효성 검사 기준을 추가하기 전에 콘솔을 통해이를 추가했습니다. 나는 5 분 후에 대답을 수락 할 것이다. – Jack

+0

나는 당신이'debug visit.engineer'를 출력하고 그 속성이 설정되어있는 것을 볼 수 있다고 말한 것 같았습니까? 또한 나중에 참조 할 수 있도록 레일즈'try' 메소드를 사용하면 약간의 공간을 절약 할 수 있습니다. 'visit.engineer.try (: 이메일)'과'visit.controller.try (: 이메일)' – Batkins

1

나에게 보인다. 연결에 :inverse_of 옵션을 사용해 보셨습니까?

예 : 또한

class Visit < ActiveRecord::Base 
    belongs_to :engineer, :class_name => "User", :foreign_key => 'engineer_id', :inverse_of => :engineer_visits 
    belongs_to :controller, :class_name => "User", :foreign_key => 'controller_id', :inverse_of => :controller_visits 
end 

, 당신은 controller 이외의 사용자 협회 뭔가 이름을 수있는 기회가? 단지 직감이지만 controller이 여러 클래스에서 키워드라는 사실 때문에 레일에서 금지 된 변수 이름 일 수 있습니다.

관련 문제