我有一个有两个型号,访问和用户的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 %>
有一个电子邮件属性,但我实际上无法显示任何单个属性。
关于如何访问这些变量的任何想法?
答案 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中的禁止变量名称。