Mon employeur me demande de créer un "proof of concept" basé sur RoR
et Flex, avant de me pencher sérieusement sur les bouquins. Du coup,
mes connaissances sont trop limitées pour essayer tes solutions plus
"propres"... pour l'instant. Je vais donc en rester là (j'ai parlé de
date, mais il s'agissait bien de datetime...) ; en revanche, j'ai un
petit souci lié à une particularité de la base Oracle :
En effet, j'ai des champs de type DATE ; certains contiennent l'heure,
d'autres non. Or, la solution marche avec les premiers, mais pas avec
les seconds... Pour remédier à ce problème lors de l'affichage dans
les vues générées par Rails, j'ai remplacé "datetime_select" par
"date_select" dans _form.rhtml. Mais pour ce qui est de mon XML,
remplacer "datetime" par "date" dans list_timespan_flexdateformat_xml
ne change rien.
Pour résumer : dans le XML, les champs Oracle DATE sont formatés par
défaut :
<start_date type="datetime">2007-08-23T00:00:00+02:00</start_date>
Et en appliquant ta solution, lorsqu'elle marche (ça dépend du format)
par exemple avec '%Y %m %d', '%Y/%m/%d' ou '%Y-%m-%d', j'obtiens
toujours :
<start_date type="datetime">2007-08-23</start_date>
Or, ce format ne convient pas au parseur Flex. Bien sûr, je peux
toujours le parser moi-même dans Flex, mais ce mystère me préoccupe.
Christophe.
On Aug 30, 4:05 pm, "Jean-François Trân" <[EMAIL PROTECTED]>
wrote:
> 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]
-~----------~----~----~----~------~----~------~--~---