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

时间:2014-04-12 07:38:41

标签: ruby-on-rails jbuilder

在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

还有更好的方法吗?

6 个答案:

答案 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

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

答案 4 :(得分:0)

如果要排除任何属性。例如:created_atupdated_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

很容易看到正在发生的事情,添加逻辑来省略字段,等等。