Public Activity - 创建基于特定属性变化的活动

Public Activity - Creating activities based on certain attribute changes

我正在使用 Rails gem、Public Activity 并希望为每个 update 操作创建一个 activity 实例但有一个问题。我只希望在更改某个属性时创建事件。在我的例子中,它将是 post 的 time_zone。以下是当前在我的 posts 控制器中创建活动的方式:

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

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

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

  • changed_attributes returns 保存前 Hash 的模型更改(意味着它是 {} 保存后,因为当前对象有一个清晰的、未更改的状态).这在您的控制器中不起作用。
  • previous_changes returns 一个 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