gpt4 book ai didi

ruby-on-rails - 美德 : distinguish empty arrays from an unset attribute

转载 作者:数据小太阳 更新时间:2023-10-29 08:08:03 26 4
gpt4 key购买 nike

我有几个提交给 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com