我有一個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測試環境和開發中看到相同的行爲。 –