2011-12-02 10 views
1

2つのモデル、訪問者、およびユーザーを持つレールアプリがあります。訪問には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ですEには、以下の例外を除いて、失敗します。私は<%= 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。それはいつも何か愚かです!エンジニアとコントローラーを2回目の訪問に追加するのを忘れてしまった。一度これらの小切手を追加すると、どの小切手が欠落していたかを簡単に確認できました。検証基準を追加する前に、これらをコンソールから追加しました。私は5分後に答えを受け入れます。 – Jack

+0

私はあなたが 'debug visit.engineer'を印刷して属性が設定されているのを見ることができたとお考えでしたか? また、後で参照するために、 'try'メソッドを使用するとスペースを節約することができます。 'visit.engineer.try(:email)'と 'visit.controller.try(:email)' – 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が多くのクラスでキーワードであるという事実のために、レールで禁じられた変数名かもしれません。

関連する問題