Ruby on Rails Model 验证及回呼

资料验证(Validation)
回呼(Callback)
资料验证(Validation)
开发网站应⽤程序,资料的正确性是很重要的。⼤家应该都不会想被有意或无意的
在资料库里塞了奇怪的资料,所以通常都会加上资料验证的机制,确保写入的资料
是符合规定的。
验证该在哪里做?
那,这个资料验证机制该写在哪里比较好呢?常⾒的选项有:

  1. 前端验证:在 HTML ⾴⾯使⽤ JavaScript 在使⽤者填写资料的时候检查。
  2. 後端验证:资料上传到服务器後,在写入资料库之前由网站应⽤程序进⾏检
    查。
  3. 资料库验证:直接由资料库本⾝所提供的功能来做资料验证。
    虽然前端验证简单容易做,但如果如果使⽤者关掉 JavaScript 功能,或是直接检视
    HTML 原始码,⾃⼰做⼀个⼀样的表单,⼀样可以送资料进来,所以即使在 HTML
    ⾴⾯已经有验证,在写入资料库前还是得再做⼀次检查。
    资料库验证虽然可⾏,但缺点不⾒得每种资料库系统都有提供⼀样的功能,⼀旦换
    了资料库系统可能会没办法正常运作。但好处是如果这个资料库还有跟其它程序语
    ⾔开发的系统共⽤,资料库验证比较可以确保不管是哪个系统写进来的资料都是正
    确的了。
    资料验证这件事在 Rails 的 MVC 三分天下的架构中,Controller 跟 Model 都可以做
    这件事,要在 View 里写 JavaScript 做检查也可以,但这件事如果交给 Controller 或
    View 来做,⼀来会让程序码的逻辑变得更复杂,⼆来这个验证不容易被重复使⽤,
    也不容易被测试,所以资料机制写在 Model 里是比较合理⽽且单纯的。
    在 Model 里加上验证
    19 Model 验证及回呼
    288
    假设我们有⼀个叫做 Article 的 Model,希望每篇⽂章的⽂章标题(title)是必填
    资讯,可以这样写:
class Article < ApplicationRecord
validates :title, presence: true
end

中间那⾏ validates ⽅法的意思是「title 这个栏位为必填栏位」,让我们开
rails console 起来试⼀下:

$ bin/rails console
>> a1 = Article.new
=> #<Article id: nil, title: nil, content: nil, is_online: nil, c
reated_at: nil, updated_at: nil, photo: nil, user_id: nil>

先⽤ new ⽅法建立⼀个 Article 物件,然後⽤ errors ⽅法看⼀下这个物件有没
有什麽状况:

>> a1.errors.any?
=> false
这时候看起来没什麽问题。接着试着呼叫 save ⽅法把这颗物件存入资料表:
>> a1.save
(0.2ms) begin transaction
(0.1ms) rollback transaction
=> false
发现 save ⽅法失败了,并且回传 false,来看看到底是哪边有问题:
>> a1.errors.any?
=> true

原本没问题的,在 save 之後变得有问题了。来看看错误讯息是什麽:

>> a1.errors.full_messages
=> ["Title can't be blank"]

除了 validates :title, presence: true 之外,还有另⼀种写法:

class Article < ActiveRecord::Base
validates_presence_of :title
end

效果也是⼀样的。
除了 presence 之外,Rails 还有提供其它像是 uniqueness 、 length 或
numericality 等便利的验证器,使⽤⽅法可直接参考 Rails Guide 的 Validations
章节。

参考资料

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


<<:  [重构倒数第04天] - 轮播套件难道只可以做图片轮播吗

>>:  Day12 Select

【第16天】训练模型-DenseNet201

摘要 DenseNet201 1.1 来源 1.2 架构 1.3 特性 训练过程 2.1 预训练模型...

NetSuite Reporting - Saved Search

NetSuite Reporting NetSuite 内建许多常用的报告, 包括各种收入支出表, ...

D24. 学习基础C、C++语言

D24. C++的标准输出 先来看看最原始的C++ Hello World程序码 #include ...

【Side Project】 序

Junior engineer(初级工程师) 开发项目一段时间後,会开始慢慢发现, 上头交代的任务...