我有一个Rails应用程序,我需要跟踪第一次和某个用户角色查看记录的最近时间。我是Rails的新手,但到目前为止,我的方法是让after_action
调用一个方法来设置读取状态,如下所示:
after_action :set_read_status, only: :show
以下是set_read_status
:
def set_read_status
if current_user.role == 'site_user'
@record.first_read = DateTime.current
@record.latest_read = DateTime.current
@record.save!
end
end
但它做了几件意想不到的事情:
在我的RSpec文件中,当我使用不同的用户角色测试此方法时,它不应该设置这些值,但它正在这样做。这段代码:
expect( assigns(:record).first_read ).to be_nil
expect( assigns(:record).latest_read ).to be_nil
获取此结果:
1) RecordsController GET #set_read_status non-site users does not update read status
Failure/Error: expect( assigns(:record).first_read ).to be_nil
expected: nil
got: 2016-05-18 16:17:54.386616709 +0000
当我转到我的记录#index页面并打印这些值时,它们是否为零,但是当我转到记录#show页面时,该值已设置。并且,当我在Rails控制台中查看该记录时,未设置日期。
为什么Rails会认为这个值在一个页面上为零,而在另一个页面上显示日期?
另外,这并不像Rails-y这样做的方式 - 我不喜欢用这些值来制作我的Record模型。有更好的方法吗?
答案 0 :(得分:0)
使用after_action:
after_action :set_read_status, only: :show
仅适用于一个动作show
。如果你想在索引中运行你的代码,你必须指定它:
after_action :set_read_status, only: [:show, :index]
当然,在index
操作中,您可能需要@records
而不是@record
,因此您必须调整方法set_read_status
。
也许考虑根据您的角色政策处理标记记录的单独类。您甚至可以创建单独的模型来保持用户与记录的交互。
关于Rspec
测试,您必须知道他们正在使用test
环境而不是development
环境,因此他们会创建单独的数据库等。