来自具有嵌套属性的表单的验证失败的重复记录

时间:2012-03-05 22:00:58

标签: ruby-on-rails ruby ruby-on-rails-3 formtastic

所以我在我的应用程序中看到一些非常奇怪的功能。我有一个非常复杂的形式与嵌套属性。基本上在验证失败时,我将返回到表单并且已经复制了失败的记录。似乎它可能是模型在验证失败后初始化记录的方式。

注意:我使用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"

3 个答案:

答案 0 :(得分:0)

我相信你的问题是使用after_initialize回调。每次ActiveRecord类实例化一个新对象后,都会调用它。这是误导,让我遇到麻烦。

答案 1 :(得分:0)

作为临时修复,我将以下内容添加到我的控制器中,直到有人给我一个更好的建议。

if @firm.users.length < 1
  @first_user = @firm.users.first
  @firm.users = nil
  @firm.users < @first_user
end

答案 2 :(得分:0)

发生这种情况的原因是你的模型和&#34; new&#34;都有User.new。控制器的动作,我会在一个地方进行初始化。我是在&#34; new&#34;动作。