无法访问相关模型中的变量

时间:2011-12-02 23:22:45

标签: ruby-on-rails ruby ruby-on-rails-3 devise

我有一个有两个型号,访问和用户的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 -%>

这是失败的地方,但有以下例外:

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

如果我打印<%= debug visit.engineer %>有一个电子邮件属性,但我实际上无法显示任何单个属性。

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

2 个答案:

答案 0 :(得分: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 :(得分: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是许多类中的关键字,因此它可能是rails中的禁止变量名称。