Active Record Validations part 1

Posted by Anthony Chao on 2019-09-29

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

為什麼需要驗證?

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


寫驗證前需知道的事

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

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

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

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

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

1
2
3
4
5
6
create
create!
save
save!
update
update!

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

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

1
save(validate: false)

看錯誤訊息

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

1
2
3
4
5
6
7
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

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

1
2
3
class Person < ApplicationRecord
validates :terms_of_service, acceptance: true
end

Validates_associated

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

1
2
3
4
class Library < ApplicationRecord
has_many :books
validates_associated :books
end

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

Confirmation

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

1
2
3
class Person < ApplicationRecord
validates :email, confirmation: true
end

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

1
2
3

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

Exclusion

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

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

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

Format

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

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

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

Inclusion

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

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

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

參考資料:

Rails Guide





prevent_hack