首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Virtus:区分空数组和未设置属性

Virtus:区分空数组和未设置属性
EN

Stack Overflow用户
提问于 2015-08-12 01:06:17
回答 1查看 517关注 0票数 5

我有几个表单提交给Virtus对象(通过一个控制器)。有些表单包含一个extras属性,另一些则不包含。

目前,我无法区分extras是否已设置为空数组(即用户取消了表单上的所有复选框),也无法区分是否还没有提交附加文件。在这两种情况下,extras都将是一个空数组。

我需要这种区别,因为如果用户取消了所有的extras,我需要更新它们。另一方面,如果附加部分不是表单的一部分(即不在params中),我就不应该更新它们。

代码语言:javascript
复制
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上给我一个零呢?

代码语言:javascript
复制
UpdateForm.new(booking_time: Time.current)

还是有更好的模式来做这件事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-12 08:19:34

默认情况下,@extras属性将设置为空数组(即使您将添加 default: nil设置为该属性)。

您可以做的是重写初始化程序,以便将@extras设置为nil,除非实际定义了它。

并使用#nil?代替#blank?,后者在空数组上返回true。

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31954440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档