【问题标题】:Make a fields_for block conditional使 fields_for 块有条件
【发布时间】:2012-09-20 17:53:30
【问题描述】:

我有一个用户模型和一个讲师模型。用户和讲师之间存在一对一的关系。有些用户将成为讲师,有些则不会。因此,我有一个注册表单,它使用 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

【问题讨论】:

  • 这不是在回答您的问题,但是您所描述的用例对我来说听起来像single-table inheritancehas_one/belongs_to 组合更好地处理。毕竟,您是说讲师用户,而不是讲师属于用户。
  • 我喜欢这个想法,但我对单表继承的理解是所有数据都需要存放在一个表中。我想保持这些非常分开,只是因为这些信息是较少的讲师和更多的讲师个人资料信息。虽然我知道我的命名并不完美。

标签: ruby-on-rails ruby forms devise haml


【解决方案1】:

我解决了这个问题。现在看来一切都太明显了。为了使 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"

这表明没有为用户创建教师资料,因此不会写入表。在它发回空白属性和验证失败之前。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多