我有几个提交给 Virtus 对象的表单(通过 Controller )。有些表单包含 extras
属性,有些则不包含。
我目前无法区分 extras
是否已设置为空数组(即用户取消选择表单上的所有复选框)或者是否从未提交过 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
上给我一个 nil:
UpdateForm.new(booking_time: Time.current)
或者是否有更好的模式来做到这一点?
最佳答案
默认情况下,@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
关于ruby-on-rails - 美德 : distinguish empty arrays from an unset attribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31954440/