iT邦幫忙

2023 iThome 鐵人賽

DAY 22
0
Software Development

Zero to Ruby on Rails系列 第 22

Day 22 - Validation 資料驗證

  • 分享至 

  • xImage
  •  

什麼是資料驗證?

開發網站應用程式,資料的正確性非常重要,用於確保應用程式接收到的數據資料符合預期的格式和條件,有助於防止無效或惡意數據進入網站應用程式,提高應用程式的安全性和穩定性

內建的驗證方法

Ruby on Rails 提供了許多內建的驗證方法,可以輕鬆地用於模型 Model 去做驗證的操作,以下是一些常見的內建驗證方法:

存在性驗證(Presence Validation)

存在性驗證確保特定字段不為空

class User < ApplicationRecord
  validates :username, presence: true
end

長度驗證(Length Validation)

長度驗證可以讓像是標題內文等等的長度在指定範圍內

class Post < ApplicationRecord
  validates :title, length: { minimum: 5, maximum: 100 }
end

數值範圍驗證(Numerical Range Validation)

數字一樣也可以有範圍驗證

class Product < ApplicationRecord
  validates :price, numericality: { greater_than_or_equal_to: 0 }
end

唯一性驗證(Uniqueness Validation)

唯一性驗證確保資料具有唯一性

class EmailSubscription < ApplicationRecord
  validates :email, uniqueness: true
end

自訂驗證(Custom Validation)

除了 Rails 提供的內建驗證方法之外,也可以根據專案的需求,自行去自訂驗證方法:

class Person < ApplicationRecord
  validate :check_age

  def check_age
    if age.present? && age < 18
      errors.add(:age, "must be 18 or older")
    end
  end
end

驗證錯誤處理

當資料驗證失敗時,Rails 會將錯誤訊息儲存在模型的 errors 屬性中,以便於處理和顯示給使用者

在 controller 中處理驗證錯誤:

def create
  @user = User.new(user_params)
  if @user.save
    # 成功保存
  else
    # 驗證失敗,處理錯誤
    render 'new'
  end
end

複雜的驗證

在某些情況下,資料驗證可能變得複雜,這時就可以使用 validate 方法來執行自訂的複雜驗證邏輯

以下是一個比較複雜的驗證範例:

假設有一個 Order 模型和一個 Coupon 模型,每個訂單可以有一個優惠券,並且優惠券可以減免訂單總價,而且需要符合以下條件:

如果訂單使用了優惠券,則訂單總價必須大於零。
如果訂單未使用優惠券,則不應該有任何關於優惠券的數據。

# app/models/order.rb
class Order < ApplicationRecord
  belongs_to :coupon, optional: true

  validate :check_order_total

  def check_order_total
    if coupon.present?
      if total_amount <= 0
        errors.add(:base, "Order total must be greater than 0 when using a coupon.")
      end
    else
      # 如果未使用優惠券,確保為空值
      self.coupon_code = nil
      self.discount_amount = nil
    end
  end
end
# app/models/coupon.rb
class Coupon < ApplicationRecord
  has_one :order

  # 假設 coupon 模型有一個 code ,用於儲存優惠碼代碼
end

如果訂單使用了優惠券(coupon.present?),那麼訂單的總價 total_amount 必須大於零。如果不符合這個條件就將錯誤加到 :base 中,如果訂單未使用優惠券,需確保(coupon_code 和 discount_amount)為空值,同時在 order 的 model 中增加關聯性 belongs_to :coupon, optional: true 這樣一來,當建立或更新訂單時,將根據使用的優惠券狀態自動執行驗證囉!

預告

明天預計來介紹剛剛提到的關聯性,我們明天見!


上一篇
Day 21 - CRUD 實作 part2
下一篇
Day 23 - Model 關聯性
系列文
Zero to Ruby on Rails30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言