在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
还有更好的方法吗?
答案 0 :(得分:43)
也许你可以使用json.merge!
。
json.merge! notification.attributes
https://github.com/rails/jbuilder/blob/master/lib/jbuilder.rb#L277
答案 1 :(得分:8)
我正在使用jbuilder 1.5.0并合并!没有工作,但我找到了另一种语法:
json.(notification, *notification.attributes.keys)
答案 2 :(得分:2)
为@uiureo的回答添加更多内容
假设您的通知具有某种类型的图像上传器(例如载波,回形针)
然后下面的版本不会返回你的上传者对象,那么你如何获得图片网址?
json.merge! notification.attributes
notification.attributes
是对象的哈希转换,它将返回已挂载的上传列值但不返回网址。
notification: Object {
title: "hellow world"
img: "sample.png"
}
相反尝试这个
json.merge! notification.as_json
这会将已装载的列作为另一个对象返回,您可以在其中查询网址。
notification: Object {
title: "hellow world"
img: Object {
url: "https://www.example.com/sample.png"
}
}
答案 3 :(得分:0)
您可以查看json.except!
json.except! @resource, :id, :updated_at
json.except! @resource
答案 4 :(得分:0)
如果要排除任何属性。例如:created_at
和updated_at
json.merge! notification.attributes.reject{ |key, _| key.in?(['created_at', 'updated_at']) }
答案 5 :(得分:0)
这就是我的做法
json.property do
Property.column_names.each do |name|
json.set! name, @property.try(name)
end
# has_ones:
json.contact @property.contact
end
很容易看到正在发生的事情,添加逻辑来省略字段,等等。