0

ユーザーモデルとインストラクターモデルがあります。ユーザーとインストラクターの間には1対1の関係があります。また、一部のユーザーはインストラクターになり、一部のユーザーはそうではありません。そのため、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
4

1 に答える 1

0

問題を修正しました。今ではあまりにも明白に思えます。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"

これは、ユーザーのインストラクタープロファイルが作成されていないことを認識しているため、テーブルに書き込みません。空白の属性を送り返し、検証に失敗する前。

于 2012-09-21T17:24:07.743 に答える