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 :
> J'ai testé et ça a l'air de marcher ! Tu me sors une épine du pied. Je
> vais maintenant définir un nouveau format dans environment.rb via
> ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS.merge!
> (). Merci encore,
>
> Christophe.
>
> P.S. : voici ma nouvelle fonction :
>
>
>   def list_timespan_flexdateformat_xml
>     old_proc = Hash::XML_FORMATTING['datetime']
>     Hash::XML_FORMATTING['datetime'] = Proc.new { |datetime|
> datetime.to_s(:rfc822) }
>
>     @rv_wrk_medical_consultations = RvWrkMedicalConsultation.find(
>                                       :all, :conditions =>
> [ "start_date >= ? and end_date <= ?",
>
> params[:start_date], params[:end_date]])
>     render :xml => @rv_wrk_medical_consultations.to_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 )

--~--~---------~--~----~------------~-------~--~----~
Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de 
Google Groups.
Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse 
[email protected]
Pour résilier votre abonnement envoyez un e-mail à l'adresse [EMAIL PROTECTED]
-~----------~----~----~----~------~----~------~--~---

Répondre à