2

我正在使用 Rails gem,Public Activity,并希望为每个update操作创建一个活动实例,但需要捕获。我只希望在更改某个属性时创建事件。在我的情况下,这将是一个帖子的time_zone. 以下是我的帖子控制器中当前创建活动的方式:

class PostsController < ApplicationController
  def update
    ...
    @post.create_activity :update, owner: current_user
    ...
  end
end

我在文档中找不到任何解释如何执行上述操作的内容。有没有办法设置,比方说一个条件来检查是否time_zone已更改以实现这一点?

4

1 回答 1

0

ActiveModel::Dirty处理跟踪模型中属性的更改。有多种方法可以判断特定属性是否发生了变化:

  • changed_attributes在保存之前返回一个Hash模型更改(这意味着它{}在保存之后,因为您对当前对象有一个清晰的、未更改的状态)。这在您的控制器中不起作用。
  • previous_changes返回Hash由保存更改的属性。这就是您想要的控制器。

因此,您的控制器中需要以下内容

def update
  @post = Post.find(params[:id])
  @post.update!(post_params)

  if @post.previous_changes.key?('time_zone')
    @post.create_activity(:update, owner: current_user)
  end
end
于 2015-11-23T21:17:59.707 回答