我有几种提交给Virtus对象的表单(通过控制器)。某些表单包含extras
属性,而其他表单则不包含。
我目前无法区分extras
是否已设置为空数组(即用户取消选择表单上的所有复选框)或者是否从未提交过附加内容。在任何一种情况下,extras
都是一个空数组。
我需要这种区别,因为如果用户取消选择所有extras
,我需要更新它们。另一方面,如果附加内容不是表格的一部分(即不在参数中),我不应该更新它们。
class UpdateForm
include Virtus.model(nullify_blank: true)
include ActiveModel::Model
attribute :extras, Array
attribute :booking_time, Time
def save
updatable_attributes = self.attributes.delete_if { |key, value| value.blank? }
some_object.update(updatable_attributes)
end
end
如果我这样打电话,我如何让Virtus给我extras
一个零:
UpdateForm.new(booking_time: Time.current)
或者有更好的模式吗?
答案 0 :(得分:1)
默认情况下,@extras
属性将设置为空数组(即使您add default: nil
属性。)
您可以做的是覆盖初始值设定项,以便将@extras
设置为nil
,除非它已实际定义。
并使用#nil?
而不是#blank?
,它在空数组上返回true。
class UpdateForm
include Virtus.model(nullify_blank: true)
include ActiveModel::Model
attribute :extras, Array
attribute :booking_time, Time
def initialize(opts={})
super
@extras = nil unless (opts[:extras] || opts['extras'])
end
def save
updatable_attributes = self.attributes.delete_if { |key, value| value.nil? }
some_object.update(updatable_attributes)
end
end