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

标签 ruby-on-rails ruby

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

相关文章:

ruby-on-rails - 来自地理位置的时区

ruby-on-rails - 如何自定义 Spree 结账流程?

mysql - Ruby:我如何在 Ruby 中只提取一个 MYSQL 记录而不是使用 each_hash 做

ruby - 数组中的数字未键入为整数?

ruby-on-rails - 如何测试 Rspec 中不存在的 url?

ruby-on-rails - 如何在 pry 中留下方法

ruby - 在没有 ruby 循环的情况下从范围编号中计算相同的包含编号

ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态

ruby-on-rails - 我只能在附加以下参数时安装 gems for rails --source http ://rubygems. org/

jquery - JQuery 和 Backbone.js on Rails 3 的问题