2012-03-05 5 views
1

私のアプリには非常に奇妙な機能があります。私はネストされた属性を持つかなり複雑なフォームを持っています。基本的に、検証に失敗した場合は、フォームに戻ってきて、失敗したレコードが重複しています。それは、検証が失敗した後にモデルがレコードを初期化する方法を持つものかもしれません。ネストされた属性を持つフォームからの検証に失敗したレコードが重複しています

:formtasticを使用してフォームを作成していますが、私はそれを原因と判断していません。

私のモデルはかなり複雑ですが、重要では部品は以下のとおりです。

... 
accepts_nested_attributes_for :users 
... 
after_initialize :build_structure 
... 
private 

def build_structure 
    # builds the first user when the firm is initialized 
    if users.length < 1 
     logger.debug "First User!!!" 
     user = users.new 
     contact = user.contact = Contact.new 
     contact.email_addresses.new 
    end 
end 

A基本コントローラー:

def new 
    @firm = Firm.new 
    render "new", layout: "blankslate" # new.html.erb 
end 

def create 
    @firm = Firm.new(params[:firm]) 

    respond_to do |format| 
     if @firm.save 
      format.html { redirect_to root_url(subdomain: @firm.url)} 
     else 
      format.html { render action: "new", layout: "blankslate" } 
     end 
    end 
end 

とビュー:

.container 
    .row 
    .span4.offset4.well 
     .page-header 
     %h1 Create Your Firm 
     = semantic_form_for @firm, url: signup_path do |f| 
     = f.input :name 
     = f.input :url 
     .page-header 
      %h1 Create Your User 
     = f.fields_for :users do |u| 
      = u.fields_for :contact do |c| 
      = c.input :first_name 
      = c.input :last_name 
      = c.fields_for :email_addresses do |cf| 
       = cf.input :value, label: "Email Address" 
      = u.input :password 
      = u.input :password_confirmation 


     = f.submit "Signup", class: "btn btn-primary" 

答えて

0

これが起こっていることの理由は、あなたがあなたのモデルとあなたのコントローラの「新」アクションの両方でUser.newを持って、私は1つの場所で初期化を行うだろうということです。私は「新しい」行動でそれを行います。

+0

これを実行して、私が追加のレコードを生成していないことを確認するために追加の魔法を追加しました。 –

0

あなたの問題は、after_initializeコールバックの使用だと思います。これは、新しいオブジェクトがActiveRecordクラスによってインスタンス化されるたびに呼び出されます。それは誤解を招き、以前私を困らせてしまった。

+0

残念ながら、私は問題として初期設定を除外しました。他のアイデア? –

0

一時的な修正として、誰かが私により良い提案をするまで、次のことをコントローラに追加しました。

if @firm.users.length < 1 
    @first_user = @firm.users.first 
    @firm.users = nil 
    @firm.users < @first_user 
end 
関連する問題