iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 23
0
Modern Web

Rails guide / Ruby API study系列 第 23

[ Rails guide study ]Day23 Active Record Validations part 1

  • 分享至 

  • xImage
  •  

首先,來聽首歌吧
Yes
這首歌的原唱是 Sam Smith,但我覺得這個版本實在太好聽了所以分享給大家~


本文章範例跟文字許多引述自 Rails Guide,想參觀的可以看這裡

為什麼需要驗證?

先來說說為什麼需要驗證?
因為我們並不想要資料庫裡面存一些沒有用的資料,必須要限定這些資料至少符合特定的標準才允許寫進資料庫


寫驗證前需知道的事

  • 在 Rails 中驗證是寫在 model level,如果沒有通過驗證就完全不會碰到資料庫

  • new_record? 用來確定這筆資料是不是已經寫入資料庫

  • 我們也可以用 valid? invalid 這兩種方法看這個實體是否有效 (在未被寫入之前)

p = Person.new
p.valid?
#=> false
  • 如果用的是 create 或者 update 在 SQL 裡使用的是 INSERT 方法,如果是用 update 則是 UPDATE 方法

  • 存入資料庫的方法有下面幾種

create
create!
save
save!
update
update!

這些驚嘆號方法會導致寫入失敗的話跳出 exception,如果不捕捉的話頁面會壞掉,非驚嘆號版本則不會

在這方法後面我們可以用 validate: false 使他繞過驗證,這通常是用在開發的時候,使用時須小心

save(validate: false)

看錯誤訊息

我們在資料無法存入的時候,可以使用 errors.messages 看無法存入的原因

class Person < ApplicationRecord
  validates :name, presence: true
end

p = Person.create
p.errors.messages
# => {name:["can't be blank"]}

Validation Helpers

Rails 已經寫好一些常用的驗證方法給我們使用,在這些 helpers 後面我們都可以再加上 :on:message 這兩種屬性,決定他們要用在哪裡,還有存取失敗的時候會存進怎樣的訊息到 errors 中

Acceptance

這種驗證最常用在看完條款,要打勾的那種時候,如果不打勾無法繼續往下

class Person < ApplicationRecord
  validates :terms_of_service, acceptance: true
end

Validates_associated

在 model 之間互有關聯的時候,有時候會需要確定兩邊都有存入資料才算成功,這時候可以使用這個驗證

class Library < ApplicationRecord
  has_many :books
  validates_associated :books
end

要注意不能兩邊的 model 都寫,不然會進入無窮迴圈

Confirmation

這個驗證通常用在需要重複輸入信箱或密碼的時候,驗證你第二次輸入的內容是不是符合一開始的內容

class Person < ApplicationRecord
  validates :email, confirmation: true
end

接著我們就可以在 view 的頁面這樣寫


<%= text_field :person, :email %>
<%= text_field :person, :email_confirmation %>

Exclusion

exclusion 用在限制不讓使用者寫進特定資料

class Account < ApplicationRecord
  validates :subdomain, exclusion: { in: %w(www us ca jp)}
end

in 這個屬性裡面放陣列,陣列裡面的就是不讓使用者寫進去的資料

Format

format 用在限制資料的格式,這通常會搭配常規表示法使用

class Product < ApplicationRecord
  validates :legacy_code, format: { with: /\A[a-zA-Z]+\z/}
end

除了 with 這個屬性,我們還可以使用 without

Inclusion

inclusion 是剛剛 exclusion 的相法,如果內容不包含特定的字就無法寫入

class Coffee < ApplicationRecord
  validates :size, inclusion: { in: %w(small medium large)}
end

相關的 helpers 還很多,明天會陸續介紹喔!今天就先介紹到這邊~

參考資料:

Rails Guide

本文章同步分享於 http://anthonychao.site/


上一篇
[ Rails guide study ]Day22 Active Storage 使用
下一篇
[ Rails guide study ]Day24 Active Record Validations part 2
系列文
Rails guide / Ruby API study30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言