web-dev-qa-db-ja.com

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

もっと良い方法はありますか?

25
chikaram

多分あなたはjson.merge!

json.merge! notification.attributes

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

47
uiureo

私はjbuilder1.5.0を使用してマージしています!動作しませんでしたが、別の構文を見つけました:

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

@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"
   }
}
2
Rahul Singh

json.except!

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

json.except! @resource

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

0
user2091375

属性のいずれかを除外する場合。例:created_atおよびupdated_at

json.merge! notification.attributes.reject{ |key, _| key.in?(['created_at', 'updated_at']) }
0
Jak

これが私のやり方です

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

  # has_ones:
  json.contact @property.contact
end

何が起こっているかを確認したり、フィールドを省略するロジックを追加したりするのは簡単です。

0
Will