Christophe :
Je vais donc essayer ta méthode ; juste une question pour le débutant
RoR que je suis :
La ligne “result = yield if block_given ?”, c’est du code ou du
pseudo-code ?
c’est du pseudo-code, car normalement ça devrait être
result = yield if block_given?

C’était pour une utilisation avec un bloc de code (dans le
cas où la valeur retournée par le block est importante, donc
nécéssité de le stocker dans result)
C’est dans le cadre d’une modification temporaire.
Si ton modèle RvWrkMedicalConsultation, euh… on va supposer
que c’est le modèle Article 
si la sérialisation XML se fait toujours de la même manière,
autant le mettre dans le modèle :
class Article < AR::B
def to_xml(options= {})
old_proc = Hash::XML_FORMATTING[‘datetime’]
# ouais je me suis aperçu après que le sujet du thread parlait de date
# mais le principe est le même
Hash::XML_FORMATTING[‘datetime’] = Proc.new { |datetime|
datetime.to_s(:rfc822) }
result = super
Hash::XML_FORMATTING[‘datetime’] = old_proc
result
end
end
Dans ce cas-là le code du contrôleur est
inchangé.
On suppose que tous les champs datetime (ou date) sont
traitésà la même enseigne.
Mais après réflexion, ce code est assez bourrin, car si jamais
tu inclus des associations dans ton article, il y a des effets de bord.
C’est gênant ou pas.
Je vois 2 manières d’y remédier.
-
écrire sa propre classe XmlSerializer qui dériverait de
AR::XmlSerialization::XmlSerialize et dériver aussi
AR::XmlSerialization::XmlSerialize::Attribute
et de surcharger les méthodes qui vont bien
(#serializable_attributes et # compute_value normalement).
-
monkey patcher
AR::XmlSerialization::XmlSerialize::Attribute#compute_value
pour écrire un truc du genre :
if formatter = @record.class.xml_formatting[type.to_s]
avec une variable de classe :
class AR::B
cattr_accessor :xml_formatting, :instance_writer => false
@@xml_formatting = Hash::XML_FORMATTING
end
en fait non. Une variable d’instance de classe, ce serait mieux.
Enfin bref.
2e mail :
def list_timespan_flexdateformat_xml
Hash::XML_FORMATTING['datetime'] = old_proc
end
Si tu fais ça temporairement dans le contrôleur, ce serait peut-être
plus élégant d’en faire un around_filter :
around_filter :my_serialization, :only =>
:list_timespan_flexdateformat_xml
private
def my_xml_serialization
old_proc = Hash::XML_FORMATTING[‘datetime’]
Hash::XML_FORMATTING[‘datetime’] = Proc.new { |datetime|
datetime.to_s(:rfc822) }
yield
Hash::XML_FORMATTING[‘datetime’] = old_proc
end
Et le code de ton action est inchangé par rapport au post initial.
(et le filtre réutilisable) (pas testé).
-- Jean-François.
–
membre du CA de Ruby France.
Ruby ( http://www.rubyfrance.org ) on Rails ( http://www.railsfrance.org
)