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
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
3条答案
按热度按时间hsgswve41#
vc9ivgsu2#
如果您关心用户在表单中提交的内容,而不是模型的验证,那么可以在控制器中声明一个参数需要是一个数组。
请参阅:动作控制器概述- 4.5强参数
要声明params中的值必须是允许的标量值数组,请将键Map到空数组:
erhoui1w3#
您还可以为属性创建自己的自定义验证器。
在这种情况下,它可能看起来像:
参见:https://guides.rubyonrails.org/active_record_validations.html#custom-validators