Active Record Validations 資料驗證
注意重點:資料驗證在Controller 跟 Model 都可以做這件事,要在 View 裡寫 JavaScript 做檢查也可以,但如果交給 Controller 或 View 來做的話,會讓程式碼的邏輯變得更複雜,也不易被重複使用,所以資料機制通常會寫在 Model 裡是比較合理單純的。
當表單輸入時,使用者可能會輸入不符合資料格式或是不通過的數值,這時候就可以在UserModel中加入validates來做過濾:
class User < ApplicationRecord
validates :name, presence: true
validates :age, numericality: { greater_than: 30}
end
validates 是 Rails 的驗證器(validator)
presence: true 代表要驗證這個欄位是否存在,非空。
numericality: { greater_than: 30}驗證是否為是有效數字且大於30
此時當資料寫入資料庫時就會驗證是否符合條件,因此我們可以在寫入時增加是否寫入成功的判斷:
class UsersController < ApplicationController
def index
end
def new
@user = User.new
end
def create
# 檢查資料
clean_params = params.require(:user).permit(:name, :age, :gender)
@user = User.new(clean_params)
# 是否寫入成功
if @user.save
redirect_to root_path, notice :"新增成功"
#寫入失敗回到new的表單重新輸入
else
render new_candidate_path
end
end
end
要注意的是,並不是每一種方法都會觸發驗證:
只有 create, save,update等方法會觸發,而 toggle! 或 increment! 等方法會跳過驗證流程。
檢視錯誤訊息
當資料驗證不通過時,Rails預設會產出錯誤訊息,我們可以在Rails Console來做測試
$rails console
我們new一個新物件 然後save儲存進去
# Rails Console
a = User.new
a.save # 回傳 false
a.errors.any? # 在看一下是否有error,回傳 true
a.errors.full_messages # 顯示錯誤訊息內容 "Name can't be blank"
也可以在我們的new表單頁面加入錯誤訊息,如果存在錯誤,則印出錯誤內容。
#new.html.erb
<% if @user.errors.any? %>
<% @user.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
<% end %>
上面這段意思是 如果 輸入資料有錯誤 就把錯誤訊息印出來
檢視原始碼可以看到:他會自動幫你在錯誤的input上加一個field_with_errors的div
參考資料:
rails api