29

在 jbuilder.json 模板中一直写这样的代码是一件很痛苦的事情:

json.extract! notification, :id, :user_id, :notice_type, :message, :resource_type, :resource_id, :unread, :created_at, :updated_at

所以我想这样编码;

json.extract_all! notification

我发现我可以像下面的代码那样做,但它们对我来说仍然有点冗长。

notification.attributes.each do |key, value|
  json.set!(key, value)
end

有没有更好的办法?

4

6 回答 6

54

也许你可以使用json.merge!.

json.merge! notification.attributes

https://github.com/rails/jbuilder/blob/master/lib/jbuilder.rb#L277

于 2014-05-02T06:40:59.770 回答
11

我正在使用 jbuilder 1.5.0 并合并!没有用,但我找到了另一种语法:

json.(notification, *notification.attributes.keys)
于 2014-10-14T13:36:42.193 回答
2

在@uiureo 的答案中添加更多内容

假设您的通知有某种类型的图像上传器(例如carrierwave、回形针)

那么以下版本将不会返回您的上传者对象,那么您如何获取图片网址?

json.merge! notification.attributes

notification.attributes是对象的哈希转换,它将返回已安装的上传者列值而不是 url。

样本响应

notification: Object {
   title: "hellow world"
   img: "sample.png"
}

而是试试这个

json.merge! notification.as_json

这将作为另一个对象返回已安装的列,您可以在其中查询 url。

样本响应

notification: Object {
   title: "hellow world"
   img: Object {
       url: "https://www.example.com/sample.png"
   }
}
于 2015-10-05T11:03:01.550 回答
0

你可以看看json.except!

json.except! @resource, :id, :updated_at

json.except! @resource

https://github.com/chenqingspring/jbuilder-except

于 2017-08-21T07:14:45.507 回答
0

如果您想排除任何属性。例如:created_atupdated_at

json.merge! notification.attributes.reject{ |key, _| key.in?(['created_at', 'updated_at']) }
于 2019-02-27T20:39:22.327 回答
0

我就是这样做的

json.property  do
  Property.column_names.each do |name|
     json.set! name, @property.try(name)
  end

  # has_ones:
  json.contact @property.contact
end

很容易看到正在发生的事情,添加逻辑以省略字段等以这种方式进行。

于 2019-04-25T13:37:42.467 回答