iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 22
1

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


上一篇
DAY 21 Git Flow 是什麼?為什麼需要這種東西?
下一篇
DAY 23 Rails 中 Model 關聯
系列文
毫無基礎學習 Ruby on Rails 的 甘苦心得30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言