Virtus:将空数组与未设置属性区分开来

时间:2015-08-12 01:06:17

标签: ruby-on-rails ruby

我有几种提交给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)

或者有更好的模式吗?

1 个答案:

答案 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