在rails 3.1.3中,1对多子记录并不总是与父节点一起保存

时间:2012-02-15 15:33:29

标签: ruby-on-rails ruby-on-rails-3.1 associations

我们的rails 3.1.3 app中有user和user_level。用户具有许多user_levels,user_level属于用户。

当user_level对象在'new'中创建时,user_level记录已成功保存,如下所示:

  def new
    @user = User.new
    @user.user_levels.build     
  end

但是,使用以下代码添加的user_level记录(通过railscasts.com#197)未与@user一起保存:

  def link_to_add_fields(name, f, association)
    new_object = f.object.class.reflect_on_association(association).klass.new
    fields = f.simple_fields_for(association, new_object, :child_index => "new_#{association}") do |builder|
      render :partial => association.to_s, :locals => {:f => builder, :i_id => 0} 
    end
    link_to_function(name, "add_fields(this, \"#{association}\", \"#{j fields}\")")
  end

fields_for和simple_fields_for都没有运气。插入字段的html代码由f.simple_fields_for(association, new_object, :child_index => "new_#{association}")生成。但不知何故,添加的字段没有与@ user.save一起保存。

在成功的情况下,用@user.user_levels.build在'new'中创建了用户级对象。在不成功的情况下,该对象是在“link_to_add_fields”中使用f.object.class.reflect_on_association(association).klass.new创建的。我们试图在'link_to_add_fields'中使用obj.user_levels.build而没有运气。

有关这个问题的任何想法?非常感谢。

更新:

这是在选择了2个位置时发布到服务器的BAD字符串:

{“name”=>“pur eng”,“login”=>“tester10”,“password”=>“password”,“password_confirmation”=>“password”,“user_type”=> ;“employee”,“user_levels_attributes”=> {“1329335776431”=> {“user_levels”=> {“position”=>“mech_eng”},“_ destroy”=>“false”},“1329335779261 “=> {”user_levels“=> {”position“=>”elec_eng“},”_ destroy“=>”false“}}}

这是发布到服务器的GOOD字符串,并成功保存了用户级别。

{“name”=&gt;“tester eng”,“login”=&gt;“tester11”,“password”=&gt;“password”,“password_confirmation”=&gt;“password”,“user_type”=&gt; ;“employee”,“user_levels_attributes”=&gt; {“0”=&gt; {“position”=&gt;“elec_eng”},“1”=&gt; {“position”=&gt;“inst_eng”}}} < / p>

额外的“user_levels”=&gt;在BAD字符串中导致问题?如果是,如何删除它?

1 个答案:

答案 0 :(得分:1)

正如Ryan在节目结尾处所描述的那样:

更新:下面的代码已稍微更改以使用Rails 3.x(删除h转义调用)

def link_to_add_fields(name, f, association)
    new_object = f.object.class.reflect_on_association(association).klass.new
    fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder|
      render(association.to_s.singularize + "_fields", :f => builder)
    end
    link_to_function(name, "add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")")
end