0

J'ai un problème avec la conception de mon modèle User et de faire une forme décente pour cela. Je veux juste me faire en sorte que je le fais mal :) Il va comme ceci:Comment concevoir un modèle avec deux relations indépendantes et optionnelles avec le même modèle?

User a obtenu deux Address es:

  • un Address obligatoire pour l'identification et la facturation,
  • une expédition en option Address qu'il pouvait remplir ou laisser vide

J'ai essayé comme ceci:

class User < ActiveRecord::Base 
    has_one :address 
    has_one :shipping_address, :class_name => 'Address', :foreign_key => 'shipping_address_id' 
    accepts_nested_attributes_for :address 
    accepts_nested_attributes_for :shipping_address 
    #validations for user 
end 

et:

class Address < ActiveRecord::Base 
    #validations for address 
end 

Et puis je fais un formulaire pour User en utilisant form_for et imbriqué fields_for. Comme ceci:

= form_for @user, :url => '...' do |a| 
    = f.error_messages 
    ... 
    = fields_for :address, @user.build_address do |a| 
     ... 

Mais, malgré cela f.error_messages génère des erreurs pour tous les modèles, les champs pour Address es ne mettent pas en évidence si faux.

Aussi j'avoir des problèmes avec la désactivation de la validation de la deuxième adresse lorsque l'utilisateur a choisi de ne pas le remplir.

Et je doute que mon approche est correcte. Je veux dire la relation has_one et la conception globale de ce dispositif.

La question:

Suis-je le fais mal? Comment feriez-vous cela à ma place?

+0

J'utiliserais l'association 'belongs_to' dans' User' mais ensuite le formulaire explose! – nooga

+0

où est stockée la clé étrangère? Si le 'user' a le' address_id' et le 'shipping_address_id' il devrait être' belongs_to' sinon 'has_one' (et l'adresse' belongs_to'). – nathanvda

+0

Après avoir utilisé 'has_one' dans' User', ActiveRecord voulait les 'shipping_address_id' et 'address_id' dans Adresse! Alors je les ai mis là. Je sais que ce n'est pas la meilleure idée et toute la relation est quelque peu inversée en ce moment. – nooga

Répondre

1

Ce qui ne va pas dans votre formulaire, c'est qu'il va construire une nouvelle adresse à chaque fois que la vue est affichée, perdant ainsi toutes les erreurs de validation.

Dans votre contrôleur, dans l'action new vous devriez faire quelque chose comme

@user.build_address 

et à votre avis écrire:

= fields_for :address, @user.address do |a| 

Hope this helps.

+1

Merci! Ça a marché. Mais maintenant, il y a cette chose avec la désactivation de la validation de l'adresse de livraison quand elle n'est pas remplie. – nooga

Questions connexes