Il est difficile d’écrire des codes comme celui-ci tout le temps dans le modèle jbuilder.json:
json.extract! notification, :id, :user_id, :notice_type, :message, :resource_type, :resource_id, :unread, :created_at, :updated_at
Je voudrais donc coder comme ceci;
json.extract_all! notification
J'ai trouvé que je pouvais le faire comme les codes suivants, mais ils sont toujours un peu longs pour moi.
notification.attributes.each do |key, value|
json.set!(key, value)
end
Y a-t-il une meilleure façon?
Peut-être que vous pouvez utiliser json.merge!
.
json.merge! notification.attributes
https://github.com/Rails/jbuilder/blob/master/lib/jbuilder.rb#L277
J'utilise jbuilder 1.5.0 et fusionne! n'a pas fonctionné mais j'ai trouvé une syntaxe alternative:
json.(notification, *notification.attributes.keys)
Ajouter plus à la réponse de @uiureo
Supposons que votre notification comporte un certain type de personnes qui téléchargent des images (par exemple, carrierwave, Paperclip).
Ensuite, la version ci-dessous ne vous retournera pas l'objet de téléchargement, alors comment obtenez-vous l'URL de l'image?
json.merge! notification.attributes
notification.attributes
est une conversion de hachage d'objet, elle retournera la valeur de la colonne de téléchargement montée, mais pas l'url.
notification: Object {
title: "hellow world"
img: "sample.png"
}
Au lieu d'essayer ceci
json.merge! notification.as_json
Ceci retournera la colonne montée sous la forme d'un autre objet dans lequel vous pouvez interroger l'URL.
notification: Object {
title: "hellow world"
img: Object {
url: "https://www.example.com/sample.png"
}
}
Vous pouvez regarder json.except!
json.except! @resource, :id, :updated_at
json.except! @resource
Dans le cas où vous souhaitez exclure l'un des attributs. Ex: created_at
et updated_at
json.merge! notification.attributes.reject{ |key, _| key.in?(['created_at', 'updated_at']) }