Make a fields_for block conditional

≯℡__Kan透↙ 提交于 2020-01-16 20:01:11

问题


I have a User Model and an Instructor Model. There is a one-to-one relationship between user and instructor. And some users will be instructors and some will not. As such I have a registration form that uses a fields_for method to write to both.

How can I write to the instructor table only on the condition that they say they are an instructor, such as through a checkbox. And when they do write I want to maintain my validations of the table along with the rest of the form

Ideally this would work best if I can do this through the model, but I'm open to all suggestions.

Instructor Model

class Instructor < ActiveRecord::Base
  belongs_to :user
  validates_presence_of :school_url, :etc...
  attr_accessible :school_url, :etc...
end

User Model

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

Form in HAML

- 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:


I fixed the problem. It seems all too obvious now. In order for the fields_for to be cancelled out all I have to do is delete the instructor_attributes that are being created by the form in the controller. For example:

Create

# params[:user] => {:email => "justin@example.edu", ..., :instructor_attributes => { :school_url => "www.example.edu", ...}
# params[:instructor_check] => "0"

Given these parameters being passed, I can easily delete the attributes that are to be saved and the rails no longer tries to create a new record for instructor that's to be associated with user. This is literally the code I used. Not the most elegant, but it works.

params[:user].delete :instructor_attributes if params[:instructor_check] = "0"

This recognizes that no instructor profile is being created for the user and thus does not write to the table. Before it was sending back blank attributes and failing on the validations.



来源:https://stackoverflow.com/questions/12518109/make-a-fields-for-block-conditional

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!