2012-03-05 1 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 

기초적 컨트롤러 :

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을 가지고, 나는 한 곳에서 초기화를 할 것입니다. 나는 "새로운"행동으로 그렇게한다.

+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