我有几个表单提交给Virtus对象(通过一个控制器)。有些表单包含一个extras属性,另一些则不包含。
目前,我无法区分extras是否已设置为空数组(即用户取消了表单上的所有复选框),也无法区分是否还没有提交附加文件。在这两种情况下,extras都将是一个空数组。
我需要这种区别,因为如果用户取消了所有的extras,我需要更新它们。另一方面,如果附加部分不是表单的一部分(即不在params中),我就不应该更新它们。
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)还是有更好的模式来做这件事?
发布于 2015-08-12 08:19:34
默认情况下,@extras属性将设置为空数组(即使您将添加 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
endhttps://stackoverflow.com/questions/31954440
复制相似问题