Как использовать несколько вложенных атрибутов «один ко многим» в form_for

учитывая тот факт, что у пользователя много кредитных карт, а у кредитной карты много адресов, я пытаюсь создать форму, которая создает пользователя и кредитную карту с адресом сразу

соответствующий код модели:

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

код контроллера

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

посмотреть код

=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

Итак, проблема, с которой я сталкиваюсь, заключается в том, что поля адреса не отображаются. Я пытался добавить @user.credit_cards.addresses.build в контроллер, но получаю ошибку undefined method 'build' for nil.


person Russ Bradberry    schedule 16.09.2010    source источник


Ответы (1)


В вашем контроллере вы должны попробовать:

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

or

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

@user.credit_cards.addresses.build не работает, потому что @user.credit_cards возвращает массив…

person Yannis    schedule 16.09.2010
comment
Я только что исправил свою ошибку: @user.credit_cards.build @user.credit_cards.each{|cc| cc.addresses.build } а не @user.credit_cards @user.credit_cards.each{|cc| cc.addresses.build } - person Yannis; 16.09.2010