2015-12-08 72 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

类似于巫师的答案,这也不起作用。 –