2016-05-18 77 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測試環境和開發中看到相同的行爲。 –