Rails模型自定义验证

时间:2015-04-23 15:18:07

标签: ruby-on-rails

我的数据库中有一个属性(:book),我想将其限制为三个不同的值>>> :classic:modern:historic

我想创建自定义验证,以便在创建或更新时,用户无法输入googly-moogly

book: classic
      modern
      historic

2 个答案:

答案 0 :(得分:4)

在具有book属性的任何模型中:

VALID_BOOKS = [:classic, :modern, :historic]

validate :has_valid_book

def has_valid_book
  return if VALID_BOOKS.include? book.to_sym
  errors.add :book, 'must be a valid book'
end

修改

感谢MrYoshiji指出这个特殊情况可以简化为

VALID_BOOKS = [:classic, :modern, :historic]

validates :book, inclusion: { in: VALID_BOOKS.map(&:to_s) }

我将留下上面更冗长的例子,以防你的验证在未来变得更复杂(经常发生),并且需要一个实际的方法来解决问题。

答案 1 :(得分:0)

从@travis更新

这仅适用于单个值

您还可以使用Active Record Validations acceptance,它会收到一个:accept选项,用于确定将被视为接受的值。

例如:

class library < ActiveRecord::Base
  validates :book, acceptance: { accept: 'some value' }
end

*更新结束*

查看Validations

上的Rails指南

根据@Travis的回答和@MrYoshiji的评论,您还可以将接受的值分配给常量VALID_BOOKS = [:classic, :modern, :historic]

然后设置你的回调:

validates :book, inclusion: { in: VALID_BOOKS.map(&:to_s) }