我在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。
答案 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