如何使用Rails Jbuilder提取所有属性?

30

在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

有更好的方法吗?


1
也许这样会更简单一些:json.extract! notification, *notification.attributes.keys 但如果 Jbuilder 有类似的方法,我宁愿使用它。 - chikaram
6个回答

56

谢谢!这正是我想要的!!只是,我的Rails版本是4.0,所以我应该先升级到4.1。 - chikaram
我刚试着在Rails 4.1中使用这个方法,但不幸的是它似乎没有合并到4.1中。所以我决定再等一段时间。 - chikaram
你是否正在使用最新版本的jbuilder?尝试运行 bundle update jbuilder - zato
哦,jbuilder只是一个宝石,目前与Rails版本无关。该方法在jbuilder 2.1.1上运行良好!感谢您的麻烦。 - chikaram
1
注意不要泄露敏感属性。添加一个 reject 来过滤掉一个或多个:json.merge! user.attributes.reject {|k, v| k == 'encrypted_password' } - bjnord
在jbuild 2.11和Rails 7rc中运行良好。 - Carson Cole

11

我正在使用jbuilder 1.5.0版本,但是merge!方法没有起作用,不过我找到了一种替代语法:

json.(notification, *notification.attributes.keys)

1
正如@Dakuan所说,这遵循了JBuilder.key_format设置,如果您正在将键从snake_case转换为camelCase,则这是必需的。根据this railscast我相信在某些版本的ruby中这种语法不起作用,此时可行的语法是json.extract! notification, *notification.attributes.keys - abl

3

补充 @uiureo 的回答:

假设你的通知有某种类型的图片上传器(例如carrierwave,paperclip)

那么下面的版本将不会返回上传器对象,那么如何获取图像 URL?

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"
   }
}

0

这就是我的做法

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

  # has_ones:
  json.contact @property.contact
end

这种方法很容易看出发生了什么,可以添加逻辑来省略字段等。


0
如果您想要排除任何属性,请参考以下示例:created_atupdated_at
json.merge! notification.attributes.reject{ |key, _| key.in?(['created_at', 'updated_at']) }

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接