27

我有一个表单,我在其中传递了一个名为的字段 :type,我想检查它的值是否在允许的类型数组内,以便不允许任何人发布不允许的类型

数组看起来像

@allowed_types = [
   'type1',
   'type2',
   'type3',
   'type4',
   'type5',
   'type6',
   'type7',
   etc...
]

试过使用 validates_exclusion_oforvalidates_inclusion_of但它似乎不起作用

4

3 回答 3

51

首先,将属性从类型更改为其他内容,类型是用于单表继承等的保留属性名称。

class Thing < ActiveRecord::Base
   validates :mytype, :inclusion=> { :in => @allowed_types }
于 2012-08-21T16:50:14.187 回答
23

ActiveModel::Validations为此提供了一个辅助方法。一个示例调用是:

validates_inclusion_of :type, in: @allowed_types

ActiveRecord::Base 已经是一个 ActiveModel::Validations,所以不需要包含任何东西。

http://apidock.com/rails/ActiveModel/Validations/HelperMethods/validates_inclusion_of

此外,@RadBrad 是正确的,您不应将type其用作列名,因为它是为 STI 保留的。

于 2012-08-21T16:57:42.767 回答
10

只是为了那些懒惰的人(比如我)复制最新的语法:

validates :status, inclusion: %w[pending processing succeeded failed]
  • validates_inclusion_of自 Rails 3 以来已过时。
  • :inclusion=>自 Ruby 2.0 以来,哈希语法已过时。
  • 赞成将%wfor word 数组作为默认的Rubocop 选项

有变化:

默认类型为常量:

STATUSES = %w[pending processing succeeded failed]

validates :status, inclusion: STATUSES

OP的原文:

validates :mytype, inclusion: @allowed_types
于 2020-07-24T13:34:06.550 回答