Сделайте поля 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"

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

Другие вопросы по тегам