0

我在 Rails 5.0 上。我不太确定这是否可行,或者我是否需要采取不同的方法。我有过程和并发症的模型,其中过程 has_many Complications 定义如下;

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

向用户呈现具有多种并发症的程序的嵌套表格。我已经使用茧宝石动态地做到这一点。在新记录上,用户会看到一个空的并发症选择框。如果他们将其留空,则验证失败。这是为了强制他们选择“无”,以防止他们跳过该字段。如果他们确实选择了“无”,则不会因为该reject_if选项而添加任何并发症。所有这些都完全按预期工作。

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

如果更新记录已存在,则可能拒绝_if 选项无法删除更新记录。这个对吗?如果是这样,处理我的案件的适当方式是什么?

TIA。

4

1 回答 1

0

您想要的有点超出了该reject_if选项的范围。

_destroy = '1'如果名称为“None”(或空白或 nil),您应该能够通过更改要添加的白名单参数来获得该功能。

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
于 2017-09-10T15:38:43.090 回答