2015-12-08 102 views
1

我已通過網站搜索瞭如何完成此操作,以及許多回答指向使用changed?方法。我試圖在堅持DB之後通知更新的用戶,因此不幸的是這不起作用。如何檢查模型實例是否已更新

然後我找到了previous_changes方法,但是這也會在首次創建帖子時觸發。目標是做到這一點只能編輯操作。如何才能做到這一點?

<% if @post.previous_changes %> 
    <span>Updated:</span> <span><%= time_ago_in_words(@post.updated_at) %> ago</span> 
<% end %> 
+0

你看着寶石paper_trail?也許你的問題不夠清楚? – penner

+1

我認爲這會工作? '<%if @ post.created_at!= @ post.updated_at%>' – house9

回答

0

一個可能的解決方案是每當元素更新時設置一個標誌。

class Model 
    after_update :flag_update  

    def updated? 
    [email protected] 
    end 

    private 

    def flag_update 
    @updated = true 
    end 
end 

然後在您的代碼中只需檢查@post.updated?

+0

爲什麼雙'!!'? –

+1

@CarlEdwards,當未定義'@ updated'時,它返回'nil'。如果你做'!!',它會返回'false'作爲'nil'。 – hattenn

+0

我想我開始明白了。單個'!'和雙'!!'之間的主要區別是什麼?我以爲一個人就足以否定某件事。 –

0

你有更新的記錄時

@post.previous_changes.present? && @post.previous_changes["id"].nil? 
+0

這似乎不起作用。 –

0

聽起來像一個很好的候選人使用after_updatecallback,並在其中調用工作發送電子郵件,短信或任何你通知用戶的手段。

使用回調來標記模型實例基本上爲模型添加了一個狀態,並且僅在第一次更新之後設置了一次,因此它只能使用一次。任何後續更新可能會被忽視,具體取決於您想要通知用戶的方式和方式,除非您可以以某種方式重置狀態(標誌),這可能比其值得的工作多得多。

依靠updated_at時間戳大於created_at遭受與標記相同的一次性機會。

我們使用了一種方法,在保存之前我們檢查了模型的changes返回的結果(您也可以使用changed?),然後在成功保存後發送通知。

0

如果你能叫previous_changes,爲什麼不加一個條件,以確保id沒有(每本answer爲)改變:

<% if @post.previous_changes && [email protected]_changed? %> 
    ... 
<% end %> 
+0

類似於巫師的答案,這也不起作用。 –

相關問題