Многомодельная форма в Rails 3

#ruby-on-rails-3 #forms

#ruby-on-rails-3 #формы

Вопрос:

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

В принципе, у меня есть событие, и пользователь должен иметь возможность зарегистрироваться на мероприятие и предоставить кредитную карту для оплаты мероприятия. Кредитная карта (я не буду хранить фактические данные для CC, authorize.net будет, но мне нужно сохранить токен, представляющий карточку) будет жить с пользователем, чтобы они могли подписаться на другие события в будущем. Итак, я хочу, чтобы пользователь мог редактировать это в будущем, и карточка не привязана к одному событию. Это не похоже на то, с чем я бы использовал вложенные маршруты, не так ли?

У меня такое чувство, что это довольно просто, но, думаю, я просто не совсем уверен, как это сделать. Могу ли я использовать вложенные модели (не маршруты) и по-прежнему обновлять каждую часть независимо?

Ответ №1:

Если я понимаю ваш вопрос, то да, вы можете. Я думаю, вы имеете в виду что-то вроде этого:

 class User < ActiveRecord::Base
  has_one :credit_card
end
  

Если это правильно, то первым шагом будет добавление этого в класс User:

 class User < ActiveRecord::Base
  has_one :credit_card
  accepts_nested_attributes_for :credit_card
end
  

На этом этапе вы могли бы просто настроить ресурс «пользователи» в файле routes и отредактировать кредитную карту с помощью метода fields_for в вашем режиме редактирования:

 form_for @user do |f|
  f.fields_for :credit_card do |ff|
    ff.label :number
    ff.text_field :number
  end
  f.submit
end
  

Помогает ли это?

Ответ №2:

Поскольку форматирование в комментариях запрещено, я даю ответ на это.

Спасибо @twmills за ваш ответ,

Я тоже новичок в rails. У меня есть вопрос, будет ли это работать в случае, если у меня есть следующие отношения:

 class User < ActiveRecord::Base
  has_many :credit_cards, :dependent => :destroy
  accepts_nested_attributes_for :credit_card
end

class CreditCards < ActiveRecord::Base
  belongs_to :user
end
  

В приведенном выше случае вы не можете создать объект CreditCard, если у вас нет родительского пользователя. f.fields_for :credit_card do |ff| Также будет ли создан объект CraeditCard @user для f?

Насколько я понимаю, это невозможно, поскольку как будет указано представление, какую кредитную карту редактировать.

Во-вторых, при редактировании это нормально, но могу ли я сделать что-то подобное во время создания пользователя. т. Е. получить информацию о его кредитной карте во время создания пользователя.