我有一个用户模型和一个教练模型。用户和教师之间存在一对一的关系。有些用户将是教师,有些则不会。因此,我有一个注册表单,使用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
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
答案 0 :(得分:0)
我解决了这个问题。现在似乎太明显了。为了取消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"
这可以识别没有为用户创建教师配置文件,因此不会写入表。在它发回空白属性并且验证失败之前。