我有一个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模型。有更好的方法吗?
是的,它应该只对'show'。但在我上面的例子中,'after_action'应该完全没有效果,除非用户具有该角色。但该应用程序显示的是同一记录的相同属性的不同值 - 索引页上的“nil”和显示页面上的日期时间。然后当我回到索引时再次“无”。 –
在Rspec测试场景中?也许你不会将对象保存到数据库中,或者每次运行新场景时重新创建该对象。在开发中,您可以使用byebug观看您的控制器执行。请参阅http://edgeguides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-byebug-gem – przemod
在rspec测试环境和开发中看到相同的行为。 –