1

我正在尝试填充parameters我的活动模型的属性(来自 public_activity gem),但没有成功。

class Project < ActiveRecord::Base
  include PublicActivity::Model

  tracked owner: ->(controller, model) { controller && controller.current_user },
          parameters: ->(controller, model){
            {foo: 'bar'}
          }
end

第一个问题是当我更新项目时,参数哈希总是为空。第二个问题是,它->(controller, model)接收控制器和模型类,但不接收实例。我的目标是将更新时变更集中的两个字段放入参数(一个 id 和一个字符串)。

我怎样才能做到这一点?

4

4 回答 4

8

答案有点晚,但仍然可能对其他人有所帮助,他们试图在 PublicActivity 中使用默认参数散列。根据官方文档:

class Article < ActiveRecord::Base
      include PublicActivity::Model
      tracked :params => {
          :title => :title,
          :author_name => "Michael",
          :category_name => proc {|controller, model_instance| model_instance.category.name},
          :summary => proc {|controller, model_instance| truncate(model.text, :length => 30)}
      }
    end

更多详情可以参考: http ://rubydoc.info/gems/public_activity/PublicActivity/Tracked/ClassMethods

于 2014-03-17T14:29:18.917 回答
1

解决了它,虽然不是通过模型。看起来,在更复杂的情况下,您不会以这种方式创建它。您可以通过回调在模型中创建它(由于缺少 ,这可能会很复杂current_user,除非您做一些黑客行为),或者在控制器中创建它。

我这样做的方式:

模型

class Project < ActiveRecord::Base
  include PublicActivity::Common

  attr_accessor :previous_status_id

  before_save :remember_previous_status_id


  private

  def remember_prefious_status_id
    self.previous_status_id = self.changes['status_id'].first if self.changes.include? 'status_id'
  end
end

控制器

# [...]
if @project.update_attributes project_params
  @project.create_activity :update, 
    owner: current_user,
    previous_status_id: @project.previous_status_id, 
    parameters: {
      # ...
    }

  # ...

移民

create_table :activities do |t|
  # ...
  t.belongs_to :previous_status
  # ...

初始化器

PublicActivity::Activity.class_eval do
  belongs_to :previous_status, class_name: 'Status'
end
于 2013-10-09T18:35:00.717 回答
0

您可以activity_params在模型实例上设置变量,然后它也会保存到活动中。在你这样的情况下:

class Project < ActiveRecord::Base
  include PublicActivity::Model
  tracked owner: ->(controller, model) { controller && controller.current_user }
end

project = Project.new
project.activity_params = {foo: 'bar'}

有关更多信息,请参阅:http ://rubydoc.info/gems/public_activity/PublicActivity/Common#activity_params-instance_method

于 2013-12-13T10:24:51.120 回答
0
class Project < ActiveRecord::Base
  include PublicActivity::Model
  tracked owner: ->(controller, model) { controller && controller.current_user 
  }, parameters: :previous_changes
end

以下解决方案对我有用。您可以查看以下链接,了解有关版本 5 的活动记录 api 更改的更多更改https://www.ombulabs.com/blog/rails/upgrades/active-record-5-1-api-changes。 html

于 2019-08-19T08:45:34.857 回答