To_xml et personnalisation en étant DR Y et élégant ;)


#1

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 :wink:

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

.. ... ....

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


#2

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_


#3

Merci Jean-François, c’est parfait !

def to_xml(options = {})
defaults = {:include => :comments}
super(options.reverse_merge(defaults))
end


#4

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


#5

merci :wink:

2008/11/20 Jean-François Trân removed_email_address@domain.invalid


#6

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_