iT邦幫忙

2021 iThome 鐵人賽

DAY 28
0
自我挑戰組

Ruby on Rails JS系列 第 28

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


上一篇
Ruby on Rails Model 驗證及回呼
下一篇
Ruby on Rails ⾃訂驗證器 Validator
系列文
Ruby on Rails JS29

尚未有邦友留言

立即登入留言