我正在尝试通过创建新的联接表“ LastViewer”来联接两个先前存在的表“ Report”和“ Person”。基本上,查看器表将跟踪上次查看报告的人员。
我通过创建文件“ last_viewer.rb”来创建Rails模型,如下所示:
class LastViewer < ActiveRecord::Base
belongs_to :report
belongs_to :person
end
这产生了以下迁移:
class CreateLastViewers < ActiveRecord::Migration
def change
create_table :last_viewers do |t|
t.references :person
t.references :report
t.timestamps
end
add_index :last_viewers, :person_id
add_index :last_viewers, :report_id
end
end
现在,我开始添加代码,以便我的应用可以跟踪更改。我将以下内容添加到正确的控制器中:
@viewer = LastViewer.new
@viewer.person_id = get_current_user[:id] # correctly gets the person's ID from the correct session
@viewer.report_id = @report.id
@viewer.save
现在,在我想显示最后一个查看器的视图中,我添加了:
<% @reports.each_with_index do |report,index| %>
<% query = LastViewer.where(:report_id => report.id).last %>
<% name = query.person.name || "No Person found" %>
<% time = Format.to_time(query.created_at.localtime) %>
<% end %>
我得到的错误是:
nil:NilClass的未定义方法“名称”
在线上
<% name = query.person.name || "No Person found" %
编辑:
Person模型的各个部分:
class Person< ActiveRecord::Base
attr_accessible :hid, :name, :email, :cell, :display
has_many :last_viewer
end
报告模型的各个部分:
class Report< ActiveRecord::Base
has_many :last_viewer
end
首先,您需要更改与此的关系:(复数has_many :last_viewers
)
class Person < ActiveRecord::Base
has_many :last_viewers
class Report < ActiveRecord::Base
has_many :last_viewers
class LastViewer < ActiveRecord::Base
belongs_to :report
belongs_to :person
validates :report_id, :person_id, presence: true
然后,尝试强制创建LastViewer对象,引发错误并查看您的对象出了什么问题:
@viewer = LastViewer.new
@viewer.person_id = get_current_user[:id]
@viewer.report_id = @report.id
@viewer.save! # adding a ! will raise errors if object not valid
# one-line equivalent:
@viewer = LastViewer.create!(person_id: get_current_user[:id], report_id: @report.id)
我很确定它将出现类似“ person_id不应该为空”的错误。我认为您的方法get_current_user[:id]
未返回ID。
解决此问题后,建议您将视图重构为:
<% @reports.each_with_index do |report, index| %>
<% last_viewer = report.last_viewers.last %>
<% last_person_name = last_viewer.try(:person).try(:name) %>
<% time = Format.to_time(query.created_at.localtime) %>
<% end %>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句