0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Rails】DB接続のないログイン画面でバリデーションする

Last updated at Posted at 2022-11-22

はじめに

バリデーションは,ActiveRecordの機能として実装できますが,ActiveRecordはORMのフレームワークであるため,DB接続が必要になります.
そのため,DB接続しないモデルにはActiveRecordが使えません.
今回はActiveModelを用いて,DB接続しないモデルへバリデーションを実装する方法を整理しました.

Rails初学者による記事になります.
不足,間違い等ありましたらご指摘いただけますと幸いです.

環境

Ruby 3.0.4
Rails 6.1.7

やりたいこと

DBに接続しないsessionモデルで作成したログイン画面に,バリデーションを実装します.

実装方針

  1. sessionモデルに,ActiveModel::Modelをミックスインすることで,バリデーション機能を有効にする.
  2. sessionsコントローラで,valid?メソッドを用いて,バリデーションをトリガする.
  3. sessionsビューのnewファイルで,エラーメッセージを出力する.

Modelでバリデーション機能を実装する

app/models/session.rb
class Session
  include ActiveModel::Model

  attr_accessor :name, :email, :password

  validates :name, presence: true
  validates :email, presence: true
  validates :password, presence: true
end

ここではnameemailpasswordをログイン画面の入力項目としています.
include ActiveModel::Modelを記述します.これによりバリデーション機能が有効になります.
詳細はRailsガイド Modelモジュールを参照.

ActiveModel::Modelincludeすると、ActiveModel::APIのすべての機能を利用できるようになります。

Controllerでバリデーションをトリガする

app/controllers/session_controller.rb
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でエラーメッセージを出力する

app/views/sessions/new.html.erb
<% 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を作成する

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?