web-dev-qa-db-fra.com

Comment extraire tous les attributs avec Rails Jbuilder?

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?

24
chikaram

Peut-être que vous pouvez utiliser json.merge!.

json.merge! notification.attributes

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

41
uiureo

J'utilise jbuilder 1.5.0 et fusionne! n'a pas fonctionné mais j'ai trouvé une syntaxe alternative:

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

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.

exemple de réponse

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.

exemple de réponse

notification: Object {
   title: "hellow world"
   img: Object {
       url: "https://www.example.com/sample.png"
   }
}
2
Rahul Singh

Vous pouvez regarder json.except!

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

json.except! @resource

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

0
user2091375

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']) }
0
Jak