ruby 如果类型是数组,如何检查活动记录验证?

ftf50wuq  于 2023-06-22  发布在  Ruby
关注(0)|答案(3)|浏览(140)

我有属性用户的语言。表单提交时,是否必须返回数组?
我想在模型User中编写验证:
validates :languages, presence: true
如何写入验证,返回值必须是数组?

hsgswve4

hsgswve41#

class User< ApplicationRecord
  validate :languages_is_array

  def languages_is_array
    if !languages.kind_of?(Array)
      errors.add(:languages, "must be an array")
    end
  end

  #Another version, as moveson commented
  def languages_is_array
    errors.add(:languages, "must be an array") unless languages.kind_of?(Array)
  end

end
vc9ivgsu

vc9ivgsu2#

如果您关心用户在表单中提交的内容,而不是模型的验证,那么可以在控制器中声明一个参数需要是一个数组。
请参阅:动作控制器概述- 4.5强参数
要声明params中的值必须是允许的标量值数组,请将键Map到空数组:

params.permit(id: [])
erhoui1w

erhoui1w3#

您还可以为属性创建自己的自定义验证器。
在这种情况下,它可能看起来像:

class ArrayValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    unless value.is_a? Array
      record.errors.add attribute, (options[:message] || "must be an array")
    end
  end
end

class User < ApplicationRecord
  validates :languages, array: true
end

参见:https://guides.rubyonrails.org/active_record_validations.html#custom-validators

相关问题