LoginSignup
1
2

More than 5 years have passed since last update.

初心者がRailsガイドを1から100まで読んでみる Railsをはじめよう編その10 バリデーション

Last updated at Posted at 2018-09-29

5.10.検証(バリデーション)の追加

バリデーション?
何それおいしいの?

バリデーションとは、入力値が妥当かどうかを検証する機能です。
入力されたデータは最終的にモデルくんが食べるので、バリデーションはモデルくんにしてもらいましょう。

article.rb
class Article < ApplicationRecord
end

今のarticleモデルには何にも実装されていません。
好き嫌いなく全てのデータを食べてくれます。
毒になりそうなものまでもね。

このままじゃarticleモデルくんがおデブになってしまうので、
食事制限してあげましょう。

article.rb
class Article < ApplicationRecord
    validates :title, presence: true,
                      length: { minimum: 5 }
end

titleに対するバリデーションを設定しました。
presence:trueにすれば項目が必須になります
length:長さに関する制限ですね。今回は5文字以上。

スクリーンショット 2018-09-29 23.16.04.png
これで保存してみると …

スクリーンショット 2018-09-29 23.16.32.png

「あ」ってタイトルの記事はバリデーションを満たしてないから保存されませんでした。
(うひょーもだめなんだけど、バリデーション追加前に保存したやつだから残っちゃってるね。消したいんだけど)

サイレントで保存されないのは不親切なので、バリデーションの結果NGだったらユーザに教えてあげるようにしよう。

コントローラのnewアクションとcreateアクションを変更しました。

articles_controller.rb
    def new
        @article = Article.new
    end

    def create
        @article = Article.new(article_params)

        if @article.save
            redirect_to @article
        else
            render 'new'
        end
    end

createアクションにif文が追加されていますね。
@article.saveがtrueだったら保存に成功したその記事へリダイレクトし
falseだったらnewアクションにリダイレクトしている。
saveしようとする時にバリデーションがかかり、NGだったらfalseが返ってくるんだね。

newアクションにインスタンス変数が追加されているけど、何に使うんだろう。

new.html.erbを変更せよと言われている。

new.html.erb
<h1>New Article</h1>

<%= form_with scope: :article, url: articles_path, local: true do |form| %>
  <% if @article.errors.any? %>
  <div id="error_explanation">
    <h2><%= pluralize(@article.errors.count, "error") %> prohibited
      this article from being saved:</h2>
    <ul>
    <% @article.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
  </div>
  <% end %>
  <p>
    <%= form.label :title %><br>
    <%= form.text_field :title %>
  </p>

  <p>
    <%= form.label :text %><br>
    <%= form.text_area :text %>
  </p>

  <p>
    <%= form.submit %>
  </p>
<% end %>

<%= link_to 'Back', articles_path %>

なんかながくなったなあ。

追加されたのはこの部分

  <% if @article.errors.any? %>
  <div id="error_explanation">
    <h2><%= pluralize(@article.errors.count, "error") %> prohibited
      this article from being saved:</h2>
    <ul>
    <% @article.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
  </div>
  <% end %>

要するに保存に失敗した時にそのエラーメッセージを表示しようということらしい。
さっきnewアクションの中にインスタンス変数を作ったけど、それはこのエラーを表示するために必要だったんだね。
@article.errorsでエラーの内容を引っ張ってこれるみたい。

「pluralizeは、数値を受け取ってそれに応じて英語の「単数形/複数形」活用を行ってくれるRailsのヘルパーメソッドです。数値が1より大きい場合は、引数の文字列を自動的に複数形に変更します(訳注:pluralizeはたいていの不規則活用にも対応しています)。」
へー。(???)

@article.errors.full_messagesこれでエラーメッセージの全文が取得できるって。

スクリーンショット 2018-09-29 23.37.01.png

短すぎるって怒られた!

バリデーションは美味しいのだ!

参考

Railsガイド
https://railsguides.jp/getting_started.html

1
2
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
1
2