Forum: Rails France to_xml et personnalisation en étant DR Y et élégant ;)

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Pierre V. (Guest)
on 2008-11-20 18:31
(Received via mailing list)
Bonjour à tous,

J'ai deux models, Post (id,title, category) et Comment
(id,post_id,body, date, useful) et je suis en train de faire un API
pour y accèder ;)

Je souhaite que /posts.xml renvoie les derniers posts avec les
commentaires associés mais seulement certains champs

<posts>
  <post>
   <id>..</id>
   <title>...</title>
   <comments>
     <id>....</id>
   </comments>
  </post>
</posts>

Vous l'avez compris, je ne souhaite pas avoir les champs
posts.category et comments.body, comments.date dans mon flux XML

Je sais qu'on peut utiliser les options de to_xml en précisent les
champs à retirer, y compris pour les associations.

Mais j'utilise to_xml à plusieurs endroits de mon application et je
n'ai pas envie de répéter toutes les options partout (DRY).

J'ai pensé à override le to_xml dans chaque Model pour n'afficher que
les champs que je souhaite.

J'ai commencé à faire :

Class Post
  def to_xml(options = {})
    options[:indent] ||= 2
    xml = options[:builder] ||= Builder::XmlMarkup.new(:indent =>
options[:indent])
    xml.instruct! unless options[:skip_instruct]
    xml.posts do
      xml.tag!(:id, id)
      xml.tag!(:title, title)
      ???????
      ???????
    end
  end
end

Le problème c'est qu'avec cette technique je ne sais pas comment
inclure les commentaires dans le XML des posts, en passant bien
sûrpar leur propre fonction to_xml personnalisée. Avant, c'était :include
=> :comments qui le faisait...

Est-ce que vous avez une idée pour faire cela de la manière la plus
élégante possible ? Est-ce que j'ai intérêt à faire d'autre chose
manière ?

Je vous remercie par avance,
Pierre
Jean-François Trân (Guest)
on 2008-11-20 18:33
(Received via mailing list)
Le 20 novembre 2008 17:17, Pierre a écrit :

> Le problème c'est qu'avec cette technique je ne sais pas comment
> inclure les commentaires dans le XML des posts, en passant bien sûr
> par leur propre fonction to_xml personnalisée. Avant, c'était :include
> => :comments qui le faisait...

Tu peux surcharger dans ta classe la méthode #to_xml
c'est à dire modifier la table de hachage options comme tu
le souhaites, puis appeler super pour appeler la méthode
AR::B.to_xml originelle.

   -- Jean-François.

--
Rails Party à Paris dimanche 30 novembre !

http://twitter.com/underflow_
Pierre V. (Guest)
on 2008-11-20 20:06
(Received via mailing list)
Merci Jean-François, c'est parfait !

  def to_xml(options = {})
    defaults = {:include => :comments}
    super(options.reverse_merge(defaults))
  end
Pierre V. (Guest)
on 2008-11-20 20:10
(Received via mailing list)
Je précise juste qu'il faut regarder de près la méthode qu'on utilise
pour
merger les deux hashs... suivant les paramètres qu'on veut garder
reverse_merge ou merge....

2008/11/20 Pierre V. <removed_email_address@domain.invalid>
Jean-François Trân (Guest)
on 2008-11-20 21:23
(Received via mailing list)
Le 20 novembre 2008 18:23, Pierre a écrit :
> Je précise juste qu'il faut regarder de près la méthode qu'on utilise pour
> merger les deux hashs... suivant les paramètres qu'on veut garder
> reverse_merge ou merge....

Autre point, si tu as Post has_many :links, et que parfois tu souhaites
écrire : @post.to_xml(:include => :links)

soit au final tu veux to_xml(:include => [:links, :comments]),
soit tu veux to_xml(:include => :comments)

il faudra que tu adaptes ton code pour le cas 1.

   -- Jean-François.

--
Rails Party à Paris dimanche 30 novembre !

http://twitter.com/underflow_
Pierre V. (Guest)
on 2008-11-20 22:22
(Received via mailing list)
merci ;)

2008/11/20 Jean-François Trân <removed_email_address@domain.invalid>
This topic is locked and can not be replied to.