2011-12-02 35 views
1

我有一个有两种模型,访问和用户的Rails应用程序。访问有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 Ë失败,但下列情况除外:

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

如果我打印<%= debug visit.engineer %>有一个电子邮件属性,但我实际上并不能获得任何个人的属性显示。

关于如何访问这些变量的任何想法?

回答

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

感谢都铎王朝。这总是愚蠢的!我忘记了将工程师和控制器添加到列表中的第二次访问中。一旦我添加了这些检查,很容易看出哪一个丢失。在添加验证条件之前,我通过控制台添加了这些内容。 5分钟后我会接受答案。 – Jack

+0

我以为你说过,如果你打印出'debug visit.engineer'并且可以看到属性被设置了?另外,为了将来的参考,如果您使用rails'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是许多类中的关键字。