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
もっと良い方法はありますか?
多分あなたはjson.merge!
。
json.merge! notification.attributes
https://github.com/Rails/jbuilder/blob/master/lib/jbuilder.rb#L277
私はjbuilder1.5.0を使用してマージしています!動作しませんでしたが、別の構文を見つけました:
json.(notification, *notification.attributes.keys)
@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"
}
}
json.except!
json.except! @resource, :id, :updated_at
json.except! @resource
属性のいずれかを除外する場合。例:created_at
およびupdated_at
json.merge! notification.attributes.reject{ |key, _| key.in?(['created_at', 'updated_at']) }
これが私のやり方です
json.property do
Property.column_names.each do |name|
json.set! name, @property.try(name)
end
# has_ones:
json.contact @property.contact
end
何が起こっているかを確認したり、フィールドを省略するロジックを追加したりするのは簡単です。