2010-09-16 33 views
3

étant donné qu'un utilisateur a beaucoup de cartes de crédit et qu'une carte de crédit a beaucoup d'adresses, j'essaye de créer un formulaire qui crée un utilisateur et un crédit carte avec adresse à la foisComment j'utilise plusieurs attributs imbriqués "un-à-plusieurs" dans form_for

code modèle relavent:

class User < ActiveRecord::Base 
    has_many :credit_cards 
    accepts_nested_attributes_for :credit_cards 
end 

class CreditCard < ActiveRecord::Base 
    has_many :addresses 
    accepts_nested_attributes_for :addresses 
end 

code du contrôleur

def new 
    @user = User.new 
    @user.credit_cards.build 
end 

code de la vue

=form_for @user, :url => users_path do |u| 
    =u.label :first_name, "Name" 
    =u.text_field :first_name 
    -u.fields_for :credit_cards do |cc| 
     =cc.label :name_on_card, "Name on Card" 
     =cc.text_field :name_on_card 
     -cc.fields_for :address do |address| 
     =address.label :address, "Address" 
     =address.text_field :address1 

Donc le problème que j'ai est que les champs d'adresse n'apparaissent pas. J'ai essayé d'ajouter @user.credit_cards.addresses.build au contrôleur mais j'obtiens une erreur undefined method 'build' for nil.

Répondre

5

Dans votre contrôleur, vous devriez essayer:

cc = @user.credit_cards.build 
cc.adrresses.build 

ou

@user.credit_cards.build 
@user.credit_cards.each{|cc| cc.addresses.build } 

@user.credit_cards.addresses.build ne fonctionne pas parce que @user.credit_cards retourne un tableau ...

+0

parfait, merci pour le Reponse rapide! –

+0

Je viens de corriger une erreur que j'ai faite, c'est @ user.credit_cards.build @ user.credit_cards.each {| cc | cc.addresses.build} et non @ user.credit_cards @ user.credit_cards.each {| cc | cc.addresses.build} – Yannis