0

我在过去的几个小时里与这个错误作斗争,我无法理解它,我的研究没有给出答案。HABTM关系中的多重嵌套形式

这是一个基本的HABTM关系。输入HABTM可视化,并且我有一个交叉表InputsVisualizations,它具有自己的一些属性。

= form_for(@visualization) do |f| 

     = f.input :title 

     = f.fields_for :inputs_visualizations do |iv| 

     = iv.input :color 

     = iv.fields_for :input do |i| 
      = i.input :title 

     = f.button :submit, "Save" 


    class Input < ActiveRecord::Base 

     # Associations ------------------ 
     has_many :inputs_visualizations, dependent: :destroy, order: "inputs_visualizations.order ASC" 
     has_many :visualizations, through: :inputs_visualizations 

     # Attributes -------------------- 
     attr_accessible :title, :unit 

    end 


    class InputsVisualization < ActiveRecord::Base 

     # Associations ------------------ 
     belongs_to :input 
     belongs_to :visualization 

     # Attributes -------------------- 
     attr_accessible :input_id, :visualization_id, :color, :input_attributes 
     accepts_nested_attributes_for :input, :reject_if => lambda { |i| i[:title].blank? }, :allow_destroy => true 

    end 

    class Visualization < ActiveRecord::Base 

     # Associations ------------------ 
     has_many :inputs_visualizations, dependent: :destroy, order: "inputs_visualizations.order ASC" 
     has_many :inputs, through: :inputs_visualizations, order: "inputs_visualizations.order ASC" 

     # Attributes -------------------- 
     attr_accessible :title, :inputs_visualizations_attributes 
     accepts_nested_attributes_for :inputs_visualizations, :reject_if => lambda { |a| a[:input_id].blank? }, :allow_destroy => true 

    end 

我需要一个表单让我管理InputsVisualizations和Inputs。正如你在我的表格中看到的那样,有两个嵌套的fields_for。

案例1: 我创建了嵌套Inputs的嵌套InputsVisualization(都是new_record)。我保存表格,它们都被创建。凉!

案例2: 从同样的形式,我更新输入(现有记录)。我保存,即使属性正确传递给控制器​​,也不会更新任何内容。

我读到nested_attributes不与belongs_to关系一起工作,虽然它创建它就好了。为什么之后没有更新?

感谢

+0

请在问题中包含代码详细信息,以便即使您的github条目消失,未来的Stack Overflow读者也能理解问题。我发现你在'visualization.rb'中有一个':reject_if'条件,它查找':input_id',但是这个值不是你表单的一部分。这是什么':reject_if'检查?另外,你可以分享你的控制器的代码吗? – cschroed

+0

谢谢,这确实是我的问题的原因。 – karellm

回答

1

该行的:reject_if条件寻找一个:input_id,但不包括在形式值。所以这可能会阻止更新通过。

accepts_nested_attributes_for :inputs_visualizations, :reject_if => lambda { |a| a[:input_id].blank? }, :allow_destroy => true 
+0

感谢您花时间看! – karellm