はじめに
バリデーションは,ActiveRecordの機能として実装できますが,ActiveRecordはORMのフレームワークであるため,DB接続が必要になります.
そのため,DB接続しないモデルにはActiveRecordが使えません.
今回はActiveModelを用いて,DB接続しないモデルへバリデーションを実装する方法を整理しました.
Rails初学者による記事になります.
不足,間違い等ありましたらご指摘いただけますと幸いです.
環境
Ruby 3.0.4
Rails 6.1.7
やりたいこと
DBに接続しないsessionモデルで作成したログイン画面に,バリデーションを実装します.
実装方針
- sessionモデルに,
ActiveModel::Model
をミックスインすることで,バリデーション機能を有効にする. - sessionsコントローラで,
valid?
メソッドを用いて,バリデーションをトリガする. - sessionsビューのnewファイルで,エラーメッセージを出力する.
Modelでバリデーション機能を実装する
class Session
include ActiveModel::Model
attr_accessor :name, :email, :password
validates :name, presence: true
validates :email, presence: true
validates :password, presence: true
end
ここではname
,email
,password
をログイン画面の入力項目としています.
include ActiveModel::Model
を記述します.これによりバリデーション機能が有効になります.
詳細はRailsガイド Modelモジュールを参照.
ActiveModel::Model
をinclude
すると、ActiveModel::API
のすべての機能を利用できるようになります。
Controllerでバリデーションをトリガする
class SessionsController < ApplicationController
def new
@session = Session.new
end
def create
@session = Session.new
@session.valid?
(略)
end
(略)
end
new, createアクションで@session
というオブジェクトを生成します.
オブジェクトを生成しないと,後述のviewファイル内のerrors
メソッドでNoMethodError
が発生します.
また,ログインボタンが押下されたタイミングで,バリデーションを起動させるため,createアクション内に@session.valid?
を記述します.
valid?
メソッドは,バリデーションをトリガするメソッドです.
Viewでエラーメッセージを出力する
<% if @session.errors.present? %>
<% @session.errors.full_messages.each do |error_message| %>
<ul><li><%= error_message %></li></ul>
<% end %>
<% end %>
(略)
Viewファイルでは,errors
メソッドとfull_messages
メソッドを用いて,エラーメッセージを出力します.
errors
メソッドは,エラーメッセージに関する情報を持つオブジェクトを返します.
また,full_messages
メソッドは,エラーメッセージを配列で返します.
まとめ
DB接続しないモデルのバリデーションは,「モデルにActiveModel::Model
をミックスインし,コントローラでvalid?
メソッドを用いてトリガする」ことで実装できます.
以上です.
至らない点あればご指摘いただければと思います.
参考記事
Railsガイド Modelモジュール
Railsガイド Active Record
Rails4 DB連携なしモデルでバリデーション機能を使う
RailsでDBと連携しないModelを作成する