2012-09-05 3 views
4

Lors de la définition d'une méthode de définition virtuelle qui repose sur une autre méthode à définir, il semble que l'ordre des attributs définis dans le hachage soit important. Existe-t-il un moyen de contourner ce problème tout en attribuant des attributs de masse?Définition des attributs du modèle Rails

https://gist.github.com/3629539

EDIT

La condition dans le code réel, non représenté dans l'exemple, est la vérification de l'existence d'un objet associé. Si l'objet existe, définissez une valeur. Sinon, ignorez la valeur transmise. Cependant, j'utilise aussi accept_nested_attributes_for. Ainsi, l'attribut hash peut contenir les attributs de l'association. Dans ce cas, l'objet existera.

{:name => 'Fred', :nested_attributes => {:color => 'red'}} 

Le nom ne sera pas défini car le modèle n'existe pas.

{:nested_attributes => {:color => 'red'}, :name => 'Fred'} 

accepts_nested_attributes_for construira une instance imbriquée, puis définissez les attributs. Lorsque le nom doit être défini, l'instance existera et l'attribut imbriqué sera défini.

+0

Ew; Êtes-vous sûr que c'est la meilleure façon de s'y prendre? Vous ne connaissez pas votre contexte, mais cela pourrait-il être plus logique de gérer cela avec un rappel de modèle? –

+0

Pourriez-vous donner un exemple? – efoo

Répondre

0

La seule solution que je peux penser maintenant est de passer outre le poseur d'attributs ...

def attributes=(attrs) 
    self[:dont_set_name] = attrs.delete(:dont_set_name) 
    super 
end 
+0

c'est tout ce que je pouvais penser aussi bien – efoo

2

eu un problème similaire, et je suis venu à la solution raisonnablement générique suivante:

def assign_attributes(new_attributes) 
    assign_first = new_attributes.extract!(:must_be_set_first, :must_also_be_set_first) 
    super(assign_first) unless assign_first.empty? 
    super(new_attributes) 
end 

L'utilisation de super avec les valeurs de paramètres extraites que vous devez définir en premier garantit que vous gérez tous les cas spéciaux bizarres pour l'attribution d'attribut (est-ce une référence? Un params hash? Un paramètre multi-valeur?). Appeler assign_attributes à plusieurs reprises avec des parties d'un hachage devrait vraiment avoir les mêmes effets que de l'appeler avec le hachage entier une fois - cela devrait être raisonnablement sûr.

Questions connexes