将对象数据传递给Public_Activity记录

时间:2015-12-30 22:59:45

标签: ruby-on-rails

我正在使用Public Activity rails gem为我的rails / angular app创建一个活动功能。

我已经跟踪了我的电影模型,

include PublicActivity::Model
tracked owner: -> (controller, model) { controller && controller.current_user }

在我的activity_controller中,

def index
  @activities = PublicActivity::Activity.order("created_at desc")
  respond_to do |format|
    format.json do
      render :json => @activities.to_json(include: :owner)
    end
  end
end

当用户添加电影时,gem会在活动表中创建一个新的可跟踪记录,

create_table "activities", force: :cascade do |t|
  t.integer  "trackable_id"
  t.string   "trackable_type"
  t.integer  "owner_id"
  t.string   "owner_type"
  t.string   "key"
  t.text     "parameters"
  t.integer  "recipient_id"
  t.string   "recipient_type"
  t.datetime "created_at"
  t.datetime "updated_at"
end

我的activity_controller的输出如下所示,

{"id":3,"trackable_id":6,
  "trackable_type":"Movie",
  "owner_id":1,
  "owner_type":"User",
  "key":"movie.create",
  "parameters":{},
  "recipient_id":null,
  "recipient_type":null,
  "created_at":"2015-12-30T12:31:24.765Z",
  "updated_at":"2015-12-30T12:31:24.765Z",
  "owner":{
    "id":1,
    "email":"jon@doe.nl",
    "name":"Jon Doe"
    }
}

我想添加已添加到此记录中的电影数据。

因此,例如,当我添加电影Creed时,活动记录将如下所示,

{"id":3,"trackable_id":6,
  "trackable_type":"Movie",
  "owner_id":1,
  "owner_type":"User",
  "key":"movie.create",
  "parameters":{},
  "recipient_id":null,
  "recipient_type":null,
  "created_at":"2015-12-30T12:31:24.765Z",
  "updated_at":"2015-12-30T12:31:24.765Z",
  "owner":{
    "id":1,
    "email":"jon@doe.nl",
    "name":"Jon Doe"
    },
  "movie":{
    "id":1,
    "title":"Creed",
    "release_date":"2016-01-21"
    }
}

这可以以某种方式完成吗?

railscast tutorial Ryan可以输出有关此活动的数据。

<%= render_activity activity %>

我发现通过在我的电影模型中使用此代码,我可以在活动记录中添加一个参数。

tracked :params => {
  :title => "Creed",
}

现在,当我添加新电影(和新活动)时,它会将其添加到控制器

"parameters":{"title":"Creed"}

当然这是硬编码的,它应该是电影对象的标题。此外,这看起来不是一个好方法。因为我正在复制数据。

1 个答案:

答案 0 :(得分:0)

public_activity gem记录您对“跟踪”模型所采取的操作,然后使用活动模型中的:trackable符号引用此模型。

在您的情况下,正在“跟踪”电影模型,可以使用:trackable符号在to_json调用中访问它。

render json: @activities.to_json(include: [:owner, :trackable])

这将返回将活动呈现为json对象,如下所示:

{"id":3,"trackable_id":6,
  "trackable_type":"Movie",
  "owner_id":1,
  "owner_type":"User",
  "key":"movie.create",
  "parameters":{},
  "recipient_id":null,
  "recipient_type":null,
  "created_at":"2015-12-30T12:31:24.765Z",
  "updated_at":"2015-12-30T12:31:24.765Z",
  "owner":{
    "id":1,
    "email":"jon@doe.nl",
    "name":"Jon Doe"
   },
  "trackable":{
    "id":1,
    "title":"The Godfather",
    "release_date":"2016-01-21"
   },
  "trackable_id": 
}

请注意,电影存储在“可跟踪”键下,而不是“电影”下。