分享

[Rails][notes]Active Record Validations(1)-官網閱讀紀錄[13]

記錄自己官網文件閱讀的注釋與筆記
主要也是訓練自己閱讀英文挑戰
https://guides.rubyonrails.org/getting_started.html
官網 文件 注釋 rails Validations

Photo by Scott Webb on Unsplash

1 Validations Overview

一個非常簡單的驗證範例
  

class Person < ApplicationRecord

  validates :name, presence: true

end


  

irb> Person.create(name: "John Doe").valid? 

=> true 

irb> Person.create(name: nil).valid? 

=> false



這個驗證方法可以讓我們知道Person的name 是否為有效輸入 
如第二個給予nil就是無效輸入將不會被寫入資料庫,讓我們討論更細節一點,如何讓驗證更符合你的應用程序需求?

1.1 Why Use Validations?

Validations 用來確保存入資料庫的是有效資料。假設確認每一個使用者提供email 及 郵寄地址對你的應用程序來說是很重要的。Model-level validations將會是一個很好方法ㄤ;用來確認你的應用程式存入資料庫的資料是否為有效資料。它與資料庫無關。他無法被使用者繞過且方便測試並且容易維護。Rails提供了常見的驗證方法是輔助指令,並且也允許你自己設計驗證方法。
以下將敘述其他驗證方法優缺點,在你的資料存入資料庫前提供驗證,包含本機的資料庫約束,客戶端及控制階的驗證方法。
Database constraints 儲存過程過度依賴資料庫是驗證與維護困難,好處是若資料庫要提供給其他應用程式使用的話這可能會是個好方法,並且可以頻反使用資料表的唯一性。
前端驗證,可以被使用但是單獨實用是不安全的例如使用javascript驗證資料,若是將瀏覽器關閉javascript,驗證將會被繞過,若結合其他技術,前端驗證將提供快速的錯誤訊息給使用者
控制階級驗證這方方法看起來很便捷,但會使你的控制器看起來龐大難以維護及不易測試,以長遠來看控制器保持簡潔是一件較好的主意。

1.2 When Does Validation Happen?

這裡有兩個Active Record objects:一種對應到資料表的列,一種沒有。當你建立一個fresh,如範例當你使用new,這時物件並不屬於資料庫,若在使用save則物件被儲存在資料庫的資料表中。Active Record使用new_record?確認資料是否已經存在資料庫中,看看以下類別:
  

class Person < ApplicationRecord

end

當我們進入console
irb> p = Person.new(name: "John Doe") 
=> #<Person id: nil, name: "John Doe", created_at: nil, updated_at: nil> 
irb> p.new_record? 
=> true 
irb> p.save 
=> true
irb> p.new_record?
 => false
建立及儲存一個new record 將會傳送SQL INSERT給資料庫,如果是更新將會傳送SQL UPDATE給資料庫,Validations通常發生在傳送這些SQL指令給資料庫前,若驗證失敗,將會忽略這些SQL指令,這樣可以避免資料庫儲存無效的指令,你可以在create 、save、update時進行驗證。
以下這些方法將會觸發驗證
  • create
  • create!
  • save
  • save!
  • update
  • update!

若是使用bang versions也就是帶有驚嘆號的指令如update!,當這一項是無效時會拋出一個例外,而非bang versions則是返回一個物件。

1.3 Skipping Validations

以下的方法則會跳過驗證,請小心使用
  • decrement!
  • decrement_counter
  • increment!
  • increment_counter
  • insert
  • insert!
  • insert_all
  • insert_all!
  • toggle!
  • touch
  • touch_all
  • update_all
  • update_attribute
  • update_column
  • update_columns
  • update_counters
  • upsert
  • upsert_all
注意save也可以跳過驗證如下方法請警慎使用
save(validate: false)

1.4 valid? and invalid?

在存入資料前,rails將會執行你的驗證方法,若是驗證方法產生任何錯誤將不會進行儲存。你也可以自行進行驗證使用valid?觸發你的驗證方法。如下
  

class Person < ApplicationRecord

  validates :name, presence: true

end


  

irb> Person.create(name: "John Doe").valid? 

=> true 

irb> Person.create(name: nil).valid? 

=> false

在Active Record執行驗證後若有任何錯誤可以透過errors找到錯誤訊息,將會返回一個錯誤的集合,若是這個錯誤集合是空的,則輸入物件有效。
注意 new一個物件實例化即時是屬於無效,也不會產生一份errors 報告,因為驗證方法只確保在保存時執行。
  

class Person < ApplicationRecord

  validates :name, presence: true

end


  

irb> p = Person.new 

=> #<Person id: nil, name: nil>

 irb> p.errors.size

 => 0

irb> p.valid? 

=> false

 irb> p.errors.objects.first.full_message 

=> "Name can't be blank"

irb> p = Person.create

=> #<Person id: nil, name: nil>

irb> p.errors.objects.first.full_message

=> "Name can't be blank"

irb> p.save

=> false

irb> p.save! 

ActiveRecord::RecordInvalid: Validation failed: Name can't be blank
irb> Person.create! 
ActiveRecord::RecordInvalid: Validation failed: Name can't be blank
invalid? 則是valid?相反的行為,如果有錯誤返回true 沒有錯誤則返回false

1.5 errors[]

要確認驗證物件的屬性是否有錯誤可以透過errors[:attribute]。他會返回所有屬性的錯誤訊息,如果沒有任何錯誤則返回一個空陣列。這個方法只有使用在驗證方法之後,它僅檢查錯誤並不會觸發驗證方法。與ActiveRecord::Base#invalid?不同,errors無法確認物件的有效性。
  

class Person < ApplicationRecord

  validates :name, presence: true

end


  

irb> Person.new.errors[:name].any?

=> false

irb> Person.create.errors[:name].any?

=> true

要更深入的了解可以參考Working with Validation Errors
#官網  #文件  #注釋  #rails  #Validations 
分類:學習

評論
上一篇
  • [Rails][notes]Active Record Migrations(4)-官網閱讀紀錄[12]
  • 更多文章
    載入中... 沒有更多了