使fields_for块有条件

我有一个用户模型和一个讲师模型。 用户和教师之间存在一对一的关系。 有些用户将是教师,有些则不会。 因此,我有一个注册表单,使用fields_for方法写入两者。

如何只在他们说自己是教师的情况下才能写入教师表,例如通过复选框。 当他们写作时,我想保持表格的其他表格的validation

理想情况下,如果我可以通过模型做到这一点,这将是最好的,但我对所有建议持开放态度。

讲师模型

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

用户模型

 class User  :destroy validates_uniqueness_of :email validates :email, :confirmation => true accepts_nested_attributes_for :instructor attr_accessible :email, :password, :instructor_attributes, :etc end 

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 

我解决了这个问题。 现在看来太明显了。 为了取消fields_for,我要做的就是删除控制器中表单创建的instructor_attributes。 例如:

创建

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

鉴于传递了这些参数,我可以轻松删除要保存的属性,并且rails不再尝试为与用户关联的教师创建新记录。 这就是我使用的代码。 不是最优雅,但它的工作原理。

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

这意味着没有为用户创建教师配置文件,因此不会写入表。 在它发回空白属性和validation失败之前。