バリデーションによって、タイトルなしの投稿データの保存は阻止されているようです。 しかしこのままでは、一見記事が保存されているように見えます。 そこで、データの保存に失敗したときの処理を追加していきます。
今のままだと、データの保存に失敗しても記事一覧画面に遷移してしまいます。 そこで投稿に失敗したら、newアクションを表示する(別の画面には遷移しない)ようにコードを追加します。
データの保存に関するコードなのでcreateアクションの@article.saveの コードを下記に変更して保存してください。
if @article.save
redirect_to @articl
elserender 'new'
end
このifの処理は教程3で解説したものです。
if ~ elseは「もし〜ならば〜そうでなければ〜です」 という意味で使います。
このコードでは
もし、
if @article.save
(データ)の保存が成功したら
redirect_to article_path
(記事詳細)へ遷移しなさい。
>else
そうでなければ
render 'new'
'new'へrenderしなさい。
このrenderとはアクション内からViewを指定して呼び出すことができるメソッドです。
つまり、render 'new'とはnewアクションのViewファイルを呼びだしなさいという指示です。
if @article.save
redirect_to @article
else
render 'new'
end
とは、
もし、@articleのデータの保存に成功した場合は、記事詳細の画面へ遷移しなさい。
そうでなければ、newアクションのビュー(new.html.erb)を呼び出しなさい(新規記事作成の画面のままにしなさい)というコードです。
if~else文でデータ保存に失敗した場合は、新規記事作成の画面が表示されたままにすることができました。
しかし、このままではなぜ新規記事作成の画面のままなのかユーザーにはわかりません。
そこで、データ保存に失敗した場合はエラーが表示されるようにします。
データ保存が失敗した時に表示されているのはnew.html.erbファイルの中身です。
new.html.erbに以下のコードを追記します。
<meta charset="utf-8">
<%= form_with scope: :article, url: articles_path, local: true do |form| %>
<% if @article.errors.any? %>
<% @article.errors.full_messages.each do |msg| %>
<%= msg %>
<% end %>
<% if @article.errors.any? %>
というコードは「もしnew.html.erbの@article(newアクション内の@article = Article.new)にエラーがあれば」という条件定義です。
<% @article.errors.full_messages.each do |msg| %>
<%= msg %>
<% end %>
は繰り返し処理です。
<strong>
配列.each do |変数|
繰り返したい処理
end
</strong>
の配列の部分が今回は@article.errors.full_messagesという大きな箱だと考えてください。
Railsではバリデーション処理の為にエラーメッセージをたくさん収納したエラーメッセージBOXのようなものがあります。
エラーが発生すると、適したエラーメッセージが@article.errors.full_messagesに送られて保存されます。
その保存されたメッセージを全て順番に表示しなさいという処理の指示になっています。
ifの条件分岐と繰り返し処理がくみあわさっている為、複雑に見えますが今まで登場したコードと同じです。
コードを保存したら、ブラウザを更新してみましょう。
エラーコードが表示されるようになりました!
タイトルは最低5文字以上でないとエラーになるように設定します。
この方法はアンケートの入力フォームや、例えば何かの会員サイトの退会理由などの入力フォームなどで見かけることがあります。
「あ」などの一文字や、一単語だけではなくきちんとした文章の入力をしてほしい時などに文字の長さを指定する機能はとても便利です。
バリデーションの追加なので、最初に開いたarticle.rbに追記します。
<strong>validates :title, presence: true,length: { minimum: 5 }</strong>
article.rbファイルを保存したら新規記事作成画面のタイトルに「追加」と2文字だけいれて記事を投稿してみましょう。
先ほどとは違うエラーメッセージが表示されています。
タイトルが短すぎます(最低5文字は入力してください)という内容のメッセージになっています。
文字の長さを指定する方法も成功していることがわかります。
最後に、過去に同じタイトルの記事があったときにエラーメッセージが表示されるようにしてみましょう。
これには独特という意味のuniquenessを使用します。
article.rbファイルのバリデーションに以下のコードを追加して保存してください。
<strong>uniqueness: true</strong>
今回はエラーが発生するかどうかを確認したいので、過去に投稿した記事と同じタイトルで記事を投稿してみます。
「記事投稿」という4文字のタイトルなので、文字数のエラーメッセージと、タイトルは既に使用されていてuniquenessではないですよ、というエラーメッセージが表示されています。
このようにエラーメッセージは1つだけとは限りません。
その為、繰り返し処理で全てのエラーメッセージを表示できるようにしているのです。
ここまでで
・タイトルは空白のままだとエラー
・タイトルは最低5文字以上でないとエラー
・タイトルは過去に使用されたものだとエラー
と3つのバリデーションを追加しました。
article.rbファイルのコードを最後に確認しましょう。
class Article < ApplicationRecord
validates :title, presence: true,
length: { minimum: 5 },uniqueness: true
end
無料ビデオ講座のお知らせ
Skillhub [スキルハブ]では無料の動画講座を多数公開しています。他校だと数万円するような講座が無料で受講できます。