2008-12-22 6 views
0

Dans Rails, je suis en train de coder une série de contrôleurs pour générer du code XML. Chaque fois que je passe un certain nombre de propriétés pour to_xml comme:Définition de nouvelles propriétés par défaut pour le sérialiseur to_xml dans Rails

to_xml(:skip_types => true, :dasherize => false) 

Est-il possible que je peux définir ces nouvelles propriétés comme par défaut qui s'appliquera chaque fois to_xml est appelé dans mon application pour que je ne suis pas dois me répéter?

Répondre

3

Appelez-vous to_xml sur un hachage ou un modèle ActiveRecord (ou autre chose)?

Je ne suis pas ce que vous voudriez, mais vous pouvez facilement modifier mon_fichier to_xml et le redéfinir pour commencer avec ces paramètres. Je suggère que vous fassiez une nouvelle to_default_xml de méthode simplement appelé to_xml avec les paramètres que vous vouliez

def to_default_xml 
    self.to_xml(:skip_types => true, :dasherize => false) 
end 

Mise à jour:

Puisque vous voulez ajouter à quelques modèles ActiveRecord vous pouvez faire deux choses, ouvrir ActiveRecord :: base (qui est un peu hackish et fragile) ou créer un module et l'importer dans chaque modèle que vous souhaitez utiliser avec elle. Un peu plus de frappe, mais beaucoup de code plus propre.

je mettrais une classe dans lib/qui ressemble à quelque chose comme ceci:

module DefaultXml 
    def to_default_xml 
    self.to_xml(:skip_types => true, :dasherize => false) 
    end 
end 

Puis dans vos modèles:

class MyModel < ActiveRecord::Base 
    include DefaultXml 
end 
+0

Merci! Une méthode wrapper me semble être un bon hack (pour l'instant). Étant donné que je vais appeler cela à partir de plusieurs contrôleurs (sur les modèles ActiveRecord), où recommanderiez-vous que je mette ce code? –

0

En supposant que vous parlez de la méthode de to_xml de AR et en fonction de votre besoins, vous pouvez vous en tirer avec l'extension de la classe AcitveRecord en créant un fichier nommé: lib \ class_extensions.rb

class ActiveRecord::Base 
    def to_xml_default 
     self.to_xml(:skip_types => true, :dasherize => false) 
    end 
end 

Ensuite, mettre cela dans un initialiseur, de sorte qu'il est inclus lorsque Rails démarre:

require 'class_extensions' 

Maintenant, vous pouvez l'utiliser comme suit (w/o avoir à inclure spécifiquement dans chaque modèle):

MyModel.to_xml_default 
1

J'ai mis en place un plugin pour gérer les options de sérialisation par défaut. Découvrez-le sur github.com/laserlemon/dry_serial/tree/master.

class MyModel < ActiveRecord::Base 
    dry_serial :skip_types => true, :dasherize => false 
end 

Il supporte également plusieurs styles de sérialisation qui peut être appelé comme:

@my_model.to_xml(:skinny) 
@my_model.to_xml(:fat) 
Questions connexes