20
13

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 3 years have passed since last update.

【Rails】バリデーションを実装する

Last updated at Posted at 2019-11-21

シンプルなTODOアプリにバリデーション(入力制限)を追加していきます。

バリデーションはcreatesaveupdateなどのメソッドが呼び出されたタイミングで実行されます。

##バリデーションを追加する
タスクの最大文字数を20文字に設定するバリデーションをmodelに記述します。
文法はvalidates :{カラム名}, {ルール名}: {ルールの内容}です。

/app/models/task.rb
class Task < ApplicationRecord
  validates :title, length: {maximum: 20}
end

##エラーメッセージを表示する
バリデーションに失敗するとfalseが返され、@{オブジェクト名}.errors.full_messagesでエラーメッセージの配列を取得することができます。
まずはControllerを修正し、エラーが発生した場合時にトップページに移動しないようにします。

/app/controllers/tasks_controller.rb
class TasksController < ApplicationController
.
.
  def create
    @task = Task.new(task_params)
    if @task.save
      redirect_to tasks_url
    else
      render 'tasks/new'
    end
  end
.
.
  def update
    @task = Task.find(params[:id])
    if @task.update(task_params)
      redirect_to tasks_url
    else
      render 'tasks/edit'
    end
  end
.
.
end

次に、Viewファイルにエラーメッセージを表示する記述を追加します。

/app/views/tasks/new.html.erb
<h1>新規タスク</h1>
<% if @task.errors.any? %>
  <div>
    <ul style="color: red">
      <% @task.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
    </ul>
  </div>
<% end %>
<%= form_for(@task) do |f| %>
・
・
/app/views/tasks/edit.html.erb
<h1>タスク編集</h1>
<% if @task.errors.any? %>
  <div>
    <ul style="color: red">
      <% @task.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
    </ul>
  </div>
<% end %>
<%= form_for(@task) do |f| %>
・
・
・

##エラーメッセージを日本語化する
デフォルトのエラーメッセージは英語です。rails-i18nというgemを使って日本語化します。まずはgemを追加しましょう。

gemfile
gem 'rails-i18n'
$ bundle install

次に/config/application.rbに以下の記述を追加します。

/config/application.rb
.
.
module BoardApp
  class Application < Rails::Application
.
.
    config.i18n.default_locale = :ja
  end
end
 2019-11-21 18.15.12.png modelの属性名が英語のままなので、日本語に変更しましょう。`config/locales/ja.yml`というファイルを作成し、以下のようにカラム名と日本語の対応表を記述します。
config/locales/ja.yml
ja:
  activerecord:
    models:
      task:           #model名
    attributes:
      task:           #model名
        title: タスク名 #カラム名

作成したファイルへのパスを通します。

/config/application.rb
.
.
config.i18n.default_locale = :ja
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.yml').to_s]
.
.
 2019-11-21 18.39.40.png 日本語で表示されました。

##よく使うバリデーション一覧
・最大文字数:length: { maximum: 20 }
・最小文字数:length: { minimum: 20 }
・文字数の範囲:length: { in: 1..30 }
・空でない:presence: true
・他と被っていない:uniqueness: true
・正規表現:format: { with: /<正規表現>/}
・「<属性名>_confirmation」と一致:confirmation: true

##複数指定する場合
複数指定する場合、ルールをカンマで区切ります。

/app/models/task.rb
class Task < ApplicationRecord
  validates :title, length: {maximum: 20}, presence: true, uniqueness: true
end

メールアドレスの入力制限

model
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, uniqueness: true, format: { with: VALID_EMAIL_REGEX }

##参考
Railsのバリデーションエラーのメッセージの日本語化
Railsバリデーションまとめ

20
13
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
20
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?