2016-05-18 130 views
0

我有一个Rails应用程序,我需要跟踪第一次和特定用户角色查看记录的最近时间。我是新来的Rails,但我的做法,到目前为止是有一个after_action调用设置读取状态的方法,像这样:Rails:将记录标记为已读?

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 

当我去我的记录#索引页并打印这些价值观,他们是零,但是当我去记录#显示页,该值被设置。而且,当我在Rails控制台中查看该记录时,日期未设置。

为什么Rails认为这个值在一页上是零而在另一页上显示日期?另外,这并不像一种非常Rails-y的方式来做到这一点 - 我不喜欢用这些值激发我的Record模型。有更好的方法吗?

回答

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环境,所以他们创建单独的数据库等

+0

是的,它应该只对'show'。但在我上面的例子中,'after_action'应该完全没有效果,除非用户具有该角色。但该应用程序显示的是同一记录的相同属性的不同值 - 索引页上的“nil”和显示页面上的日期时间。然后当我回到索引时再次“无”。 –

+0

在Rspec测试场景中?也许你不会将对象保存到数据库中,或者每次运行新场景时重新创建该对象。在开发中,您可以使用byebug观看您的控制器执行。请参阅http://edgeguides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-byebug-gem – przemod

+0

在rspec测试环境和开发中看到相同的行为。 –