Rails:验证字符串的最小和最大长度,但允许它为空
Posted
技术标签:
【中文标题】Rails:验证字符串的最小和最大长度,但允许它为空【英文标题】:Rails: Validating min and max length of a string but allowing it to be blank 【发布时间】:2011-05-25 10:06:46 【问题描述】:我有一个要验证的字段。我希望该字段能够留空,但如果用户正在输入数据,我希望它采用某种格式。目前我在模型中使用以下验证,但这不允许用户将其留空:
validates_length_of :foo, :maximum => 5
validates_length_of :foo, :minimum => 5
我如何写这个来实现我的目标?
【问题讨论】:
【参考方案1】:您也可以使用这种格式:
validates :foo, length: minimum: 5, maximum: 5, allow_blank: true
或者由于您的最小值和最大值相同,因此以下内容也可以使用:
validates :foo, length: is: 5, allow_blank: true
【讨论】:
【参考方案2】:我认为它可能需要类似:
validates_length_of :foo, minimum: 5, maximum: 5, allow_blank: true
更多例子:ActiveRecord::Validations::ClassMethods
【讨论】:
对于特定尺寸,您可以使用长度约束:is【参考方案3】:或者更简洁(使用新的哈希语法),来自validates documentation:
validates :foo, length: 5..5, allow_blank: true
上限可能应该代表更有意义的东西,例如“in: 5..20”,但只是回答问题。
【讨论】:
在不认为in
将与字符串一起使用,似乎只是数字
这应该可以代替 validates :foo, length: 2..5, allow_blank: true
但在 OP 的情况下 `length: is: 5`
【参考方案4】:
来自validates_length_of documentation:
validates_length_of :phone, :in => 7..32, :allow_blank => true
:allow_blank
- 属性可能为空;跳过验证。
【讨论】:
【参考方案5】:每个 validates_* 都接受 :if 或 :unless 选项
validates_length_of :foo, :maximum => 5, :if => :validate_foo_condition
其中 validate_foo_condition 是返回 true 或 false 的方法
你也可以传递一个 Proc 对象:
validates_length_of :foo, :maximum => 5, :unless => Proc.new |object| object.foo.blank?
【讨论】:
【参考方案6】:validates_length_of :reason, minimum: 3, maximum: 30
rspec 同样是
it should validate_length_of(:reason).is_at_least(3).is_at_most(30)
【讨论】:
【参考方案7】:怎么样:
validates_length_of :foo, is: 3, allow_blank: true
【讨论】:
【参考方案8】:添加你的模型:
validates :color, length: is: 7
颜色是一个字符串:
t.string :color, null: false, default: '#0093FF', limit: 7
【讨论】:
【参考方案9】:在您的模型中,例如
def validate
errors.add_to_base 'error message' unless self.foo.length == 5 or self.foo.blanc?
end
【讨论】:
以上是关于Rails:验证字符串的最小和最大长度,但允许它为空的主要内容,如果未能解决你的问题,请参考以下文章