HABTM关系中的多个嵌套表单

时间:2013-11-20 17:27:14

标签: ruby-on-rails nested-forms nested-attributes has-and-belongs-to-many

过去几个小时我正在与这个bug斗争,我无法理解它,我的研究也没有给出答案。

这是一种基本的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: 我创建了一个嵌套的InputsVisualization与嵌套的输入(都是new_record)。我保存表单,它们都是创建的。酷!

案例2: 从同一表格中,我更新了一个输入(现有记录)。我保存,即使属性已正确传递给控制器​​,也不会更新任何内容。

我读到nested_attributes不能与belongs_to关系一起使用,尽管它创建它很好。之后为什么不更新?

由于

1 个答案:

答案 0 :(得分:1)

此行上的:reject_if条件会查找:input_id,但该值不包含在表单中。因此,这可能会阻止更新通过。

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