Сделайте поля fields_for условным
У меня есть модель пользователя и модель инструктора. Существует взаимно-однозначная связь между пользователем и инструктором. И некоторые пользователи будут инструкторами, а некоторые нет. Таким образом, у меня есть форма регистрации, которая использует метод fields_for для записи в оба.
Как я могу писать в таблицу инструкторов только при условии, что они говорят, что они инструктор, например, с помощью флажка. И когда они пишут, я хочу сохранить свои проверки таблицы вместе с остальной частью формы
В идеале это будет работать лучше всего, если я смогу сделать это через модель, но я открыт для всех предложений.
Модель инструктора
class Instructor < ActiveRecord::Base
belongs_to :user
validates_presence_of :school_url, :etc...
attr_accessible :school_url, :etc...
end
Модель пользователя
class User < ActiveRecord::Base
has_one :instructor, :dependent => :destroy
validates_uniqueness_of :email
validates :email, :confirmation => true
accepts_nested_attributes_for :instructor
attr_accessible :email, :password, :instructor_attributes, :etc
end
Форма в хамле
- resource.build_instructor
- form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f|
= hidden_field_tag :destination, { :value => destination}
.field
= f.label :firstname, "First Name"
= f.text_field :firstname
.field
= f.label :lastname, "Last Name"
= f.text_field :lastname
.field
= f.label :email, "E-Mail"
= f.email_field :email
.field
= f.label :email_confirmation, "Confirm E-Mail"
= f.email_field :email_confirmation
.field
= f.label :password
= f.password_field :password
.field
= f.label :password_confirmation, "Confirm Password"
= f.password_field :password_confirmation
#instructor-box
%p
%span.bold Are you an instructor?
= check_box_tag :instructor_check
%span Yes, I am an instructor
= f.fields_for :instructor do |i|
= render "/users/registrations/instructor", :form => i
1 ответ
Я исправил проблему. Это кажется слишком очевидным сейчас. Для того чтобы поля fields_for были отменены, все, что мне нужно сделать, - это удалить атрибуты instructor_attributes, которые создаются формой в контроллере. Например:
Создайте
# params[:user] => {:email => "justin@example.edu", ..., :instructor_attributes => { :school_url => "www.example.edu", ...}
# params[:instructor_check] => "0"
Учитывая эти параметры, я могу легко удалить атрибуты, которые должны быть сохранены, и рельсы больше не пытаются создать новую запись для инструктора, который будет связан с пользователем. Это буквально код, который я использовал. Не самый элегантный, но работает.
params[:user].delete :instructor_attributes if params[:instructor_check] = "0"
Это признает, что профиль инструктора для пользователя не создается и, следовательно, не записывает в таблицу. До этого он отправлял обратно пустые атрибуты и не проходил валидацию.