Rails:将记录标记为已读?

时间:2016-05-18 17:08:04

标签: ruby-on-rails

我有一个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模型。有更好的方法吗?

1 个答案:

答案 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环境,因此他们会创建单独的数据库等。