開發網站應用程式,資料的正確性
非常重要,用於確保應用程式接收到的數據資料符合預期的格式和條件,有助於防止無效或惡意數據進入網站應用程式,提高應用程式的安全性和穩定性
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
除了 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 這樣一來,當建立或更新訂單時,將根據使用的優惠券狀態自動執行驗證囉!
明天預計來介紹剛剛提到的關聯性,我們明天見!