Ruby on Rails Model 验证及回呼

不是每个⽅法都会被验证...
虽然验证功能很⽅便,但并不是每种⽅法都会触发验证,仅有以下这些⽅法会触发
验证:

create
create!
save
save!
update
update!

其它⽅法不会经过验证流程喔,例如像是 toggle! 或 increment! 等⽅法会跳
过验证流程,这点也需要特别留意。
有惊叹号版本的,如果验证未通过会产⽣错误讯息,没有惊叹号版本则仅会回
传该 Model 的⼀个空物件。
如果想要主动跳过验证,也可在呼叫 save 的时候加上 validate: false 的
参,像这样:

user1 = User.new
user1.save(validate: false)

验证没过的时候...
当资料验证没过的时候,可以透过该物件本⾝的 errors ⽅法得知。⼀样先做⼀颗
新的 User 物件,其中 name 栏位为必填栏位:

$ bin/rails console
>> user1 = User.new
=> #<User id: nil, name: nil, age: nil, email: nil, created_at: n
il, updated_at: nil>
试着呼叫 save ⽅法,要把这笔资料写入资料表:
>> user1.save
(0.3ms) begin transaction
(0.1ms) rollback transaction
=> false
失败了!这时候可以透过 errors ⽅法看⼀下到底是哪里出错:
>> user1.errors
=> #<ActiveModel::Errors:0x007ff6b94aa7d8 ...[略]..., @messages={:
name=>["can't be blank"]}, @details={:name=>[{:error=>:blank}]}>
>> user1.errors.full_messages
=> ["Name can't be blank"]

喔,原来是 name 栏位没填写。
在 save 的时候才发⽣验证错误吗?
有些⼈也许认为要呼叫 save 或 create ⽅法,试图把资料写入资料表的时候才
会发⽣验证错误,其实不⽤写入资料表也可以知道这笔资料是否有效。先⽤ new
⽅法建立⼀个 User 物件:

>> user1 = User.new
=> #<User id: nil, name: nil, age: nil, email: nil, created_at: n
il, updated_at: nil>
这时候检查⼀下是不是有错误讯息:
>> user1.errors.any?
=> false
很好!没有任何错误讯息。这时候⽤ valid? ⽅法问⼀下这笔资料是否能通过验
证:
>> user1.valid?
=> false
啊,没通过验证!再回头看⼀下是不是有错误讯息:
>> user1.errors.any?
=> true
>> user1.errors.full_messages
=> ["Name can't be blank"]

即使没有执⾏ save ⽅法,也是会触发验证的。

参考资料

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


<<:  Python - 在 Windows 10 上使用 PySpark 连接 Mysql 资料库参考笔记

>>:  「思考」是最困难的工作,这大概就是很少人花费精力思考的原因吧。

【图解演算法】【Hash】 LeetCode 459 Repeated Substring Pattern

Question link: https://leetcode.com/problems/repea...

System Design: 读书心得6

今天这篇呢是从我们身边朋友介绍看了ㄧ个 Youtube 影片,有关於 Lyft 的 Architec...

Day23 ( 高级 ) 仙女棒 ( 光迹效果 )

仙女棒 ( 光迹效果 ) 教学原文参考:仙女棒 ( 光迹效果 ) 这篇文章会介绍,如何在 Scrat...

Day21 NodeJS-Express VI

今天的内容是Express部份的最後一哩路:Restful API与应用程序结构化。前几天从前端到後...

【D30】结尾:佳肴上桌

本日程序码使用:d30.py 这边结合第29天的下单功能,以及第28天的制作组合单,让这个组合单的...