如何在更新期间删除子项,其中reject_if选项为accepts_nested_attributes_for

时间:2017-09-10 13:26:15

标签: ruby-on-rails nested-forms cocoon-gem accepts-nested-attributes

我在Rails 5.0上。我不太确定这是否应该有用,或者我是否需要采取不同的方法。我有过程和复杂的模型,其中过程has_many复杂定义如此;

class Procedure < ActiveRecord::Base
  has_many :complications, dependent: :destroy
  accepts_nested_attributes_for :complications, allow_destroy: true, reject_if: proc{|attr| attr[:name] == 'None'}
end

class Complication < ActiveRecord::Base
  belongs_to :procedure
  validates :name, presence: true
end

向用户显示具有多个并发症的过程的嵌套表单。我已经使用cocoon gem动态地执行此操作。在新记录上,向用户显示空复杂化选择框。如果它们为空,则验证失败。这是为了强迫他们选择“无”。为了防止他们跳过这个领域。如果他们确实选择了“无”。然后由于reject_if选项没有添加任何复杂功能。所有这些都与预期完全一样。

如果选择了并发症(例如&#39;失败&#39;)并且随后编辑过程记录,则会出现问题。如果并发症改为&#39;无&#39;然后更新记录,当我想要的行为是要销毁并发症时,并发症将保持不变(即仍然是“失败”)。

如果已经存在,则reject_if选项可能无法删除更新中的记录。它是否正确?如果是这样,处理我案件的适当方式是什么?

TIA。

1 个答案:

答案 0 :(得分:0)

您想要的是reject_if选项的范围。

如果名称为“无”(或空白或无),您应该可以通过更改列入白名单的参数来添加_destroy = '1'

class ProceeduresController

  # ...

  def update

  end

  private
    # ...
    # Only allow a trusted parameter "white list" through.
    def proceedure_params
      params.require(:proceedure)
            .permit(:name,complications_attributes: [:id, :name, :_destroy])
    end

    def update_params
      proceedure_params.tap do |p|
         p["complications_attributes"].each do |a|
           if a[:id].present? &&  ["None", nil, ""].includes?(a[:name])
             a[:_destroy] = '1'
           end
         end
       end
    end
end
class Procedure < ActiveRecord::Base
  has_many :complications, dependent: :destroy
  accepts_nested_attributes_for :complications, 
    allow_destroy: true, 
    reject_if: :reject_attributes_for_complication?

  def self.reject_attributes_for_complication?
    return false if attr[:_destroy]
    attr[:name] == 'None'
  end
end