Ruby on Rails ⾃订验证器 Validator

现有的验证器不够⽤吗?有几种⽅式可以⾃订验证器:

  1. 写⼀个⽅法,挂到 validate ⽅法上:
class User < ActiveRecord::Base
validate :name_validator
private
def name_validator
unless name.starts_with? 'Ruby'
errors[:name] << "必须是 Ruby 开头喔!"
end
end
end

注意:这个⽅法是 validate ,不是 validates 喔。
这种写法满简单的,就是直接写⼀个普通的⽅法(通常会放在 private 区块),
当条件不符规定的时候,就在 errors 这个 Hash 里⾯塞错误讯息。⽤起来就跟⼀
般的验证器差不多:

$ bin/rails console
Running via Spring preloader in process 4628
Loading development environment (Rails 5.0.1)
>> user1 = User.new(name: "孙悟空")
=> #<User id: nil, name: "孙悟空", age: nil, email: nil, created_a
t: nil, updated_at: nil>
>> user1.save
(0.1ms) begin transaction
(0.3ms) rollback transaction
=> false
>> user1.errors.full_messages
=> ["Name 必须是 Ruby 开头喔!"]
  1. 遵循 Rails 的验证器规则:
    想写出这样的语法吗?
class User < ActiveRecord::Base
validates :name, presence: true, begin_with_ruby: true
end

这个验证器可以跟其它内建的验证器⼀起混着使⽤,使⽤起来会更简洁。要写这样
的验证器需要符合 Rails Validator 的命名规则:

  1. 参数是 begin_with_ruby ,类别名称则是 BeginWithRuby 加上
    Validator ,并继承⾃ ActiveModel::EachValidator 类别。
    19 Model 验证及回呼
    293
  2. 必须实作 validate_each ⽅法。
    写起来⼤概像这样:
class BeginWithRubyValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
unless value.starts_with? 'Ruby'
record.errors[attribute] << "必须是 Ruby 开头喔!"
end
end
end

在使⽤的时候,就是跟⼀般的 validates 差不多:

class User < ActiveRecord::Base
validates :name, begin_with_ruby: true
end

在 rails console 试⼀下效果:

$ bin/rails console
Running via Spring preloader in process 4750
Loading development environment (Rails 5.0.1)
>> user1 = User.new(name: "孙悟空")
=> #<User id: nil, name: "孙悟空", age: nil, email: nil, created_a
t: nil, updated_at: nil>
>> user1.save
(0.1ms) begin transaction
(0.0ms) rollback transaction
=> false
>> user1.errors.full_messages
=> ["Name 必须是 Ruby 开头喔!"]

参考资料

[为你自己学Ruby on Rails]https://railsbook.tw/chapters/08-ruby-basic-4.html


<<:  【Day29】漫谈 AI 在音乐上其他的优秀作品

>>:  Day16 - 汇出 excel-应用篇

Day22 Plugin 从零开始到上架 - 取得权杖(iOS)

iOS这边在取得授权码後,一样准备取得权杖 Modules: struct ShortAccessT...

从 IT 技术面细说 Search Console 的 27 组数字 KPI (17) :结构化资料(收录)

Google 的文件中,目前写了 33 种不同的结构化资料功能,但有 3 种是实验中,以及有 2 种...

C# 入门之运算符(补充)

我们前面讲过一些 C# 中的运算符,如,加、减,等等。今天我们补充两个特殊的运算符,is 和 as ...

Unity自主学习(六):使用"Unity Installer"下载Unity

昨天我们因为安装失败,而改选择前往官网直接下载安装包 那麽我们将"Unity Instal...

D3JsDay07不懂资料格式,那就会我们曾相识,只是不合适—档案格式介绍

格式介绍 通常你的资料会是档案、API接口或是一个连结作为D3输入的资料,这边就以下常见的资料格式简...