从 rabl 模板访问模型方法

Access model method from rabl template

我正在尝试在 Rails rabl 模板上访问 Ruby 中的模型方法,但我无法弄清楚如何将参数传递给函数。这是模型代码 -

class Conversation < ActiveRecord::Base
    has_many :messages, dependent: :destroy
    belongs_to :sender, foreign_key: :sender_id, class_name: User
    belongs_to :recipient, foreign_key: :recipient_id, class_name: User

  def opposed_user(user)
    user == recipient ? sender : recipient
  end

end

这是我的 rabl 模板文件 -

collection @conversations, object_root: false
attributes :id, :sender_id, :recipient_id

node :otheruser do |c|
    c.opposed_user(current_user)
end

具体来说,我正在尝试 return opposed_user,但上面的错误是 wrong number of arguments (0 for 1)current_user 是 return 正确的用户,所以这是简单的事情还是我以错误的方式处理它?

更新

如果我使用 c.opposed_user(current_user).to_json 它可以工作,但是 json 是 return 转义字符串而不是实际的 json 对象。我想也许我需要使用 child 而不是 node 但不确定。

听起来你已经很接近解决这个问题了。您可以使用 as_json 而不是 to_json 来修复您已有的 RABL 模板。

最终模板如下所示:

collection @conversations, object_root: false
attributes :id, :sender_id, :recipient_id

node :otheruser do |c|
  c.opposed_user(current_user).as_json
end

使用 RABL,有许多不同的方法来处理事情。当您使用 node 时,如果您提供一个字符串,它只会添加一个键。由于 to_json returns 是一个字符串,因此您最终会得到类似 { otheruser: "whatever string you provided" }.

的内容

但是,如果您使用 as_json,您将最终提供一个 node 也可以处理的散列。例如,像这样:

node :otheruser do |c|
  { id: 1, name: 'Bob' }
end

您最终会得到 JSON,看起来像:{ otheruser: { id: 1, name: 'Bob' } }。这是 link to the documentation on node in RABL.