A Little Each Day

note to self

Railsのモデルでバリデーションエラーのメッセージを表示する方法

こんにちは。本日は投稿した時になにかしら(入力が空だったりとか)あった時にエラーメッセージが表示されるようにしてみたいと思います。

フラッシュメッセージ同様、この機能の実装もRailsでは簡単にできるので一緒に見ていきましょう。

バージョン

Ruby '2.2.1'
Rails '4.2.1'


バリデーション

Railsのモデルでエラーメッセージを表示させるには、それに対応したモデルにバリデーションをかけます。

今回は投稿を担当するPostというModelがあり、titileとcontentが投稿できると仮定して話を進めたいと思います。


まずpost.rbにバリデーションをかけます。

#post.rb

class Post < ActiveRecord::Base

  #タイトルのバリデーション
  validates :title, presence: true

  #内容のバリデーション
  validates :content, presence: true

end


上記のバリデーションのpresence: trueは存在しているかどうかを調べます。なのでもしフォームに入力しないで投稿したらエラーメッセージが表示されるようになります。

以上でバリデーションの設定は完了です。


エラーメッセージ

バリデーションによるエラーメッセージは通常各フォームの上部に表示するのが定番です。なのでフォームの上にエラーメッセージを表示できるようにコードを書きましょう。

# _form.html.erb

<%= form_for(@post) do |f| %>
  <% if @post.errors.any? %>
    <div id="error_explanation" class="alert alert-danger">
      <h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved:</h2>
      <ul>
      <% @post.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :title %><br>
    <%= f.text_field :title %>
  </div>
  <div class="field">
    <%= f.label :content %><br>
    <%= f.text_area :content %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>


上記の@post.errors.any?でオブジェクトエラーがあればtrueを返します。

あとはfull_messagesの部分でRailsが勝手にエラーを1つずつ取ってきてくれます。


それでは実際に投稿してみましょう。

今回はわざとcontentフォームに文字を入力せずエラーを発生させます。

f:id:chi_kun:20160407165955p:plain


するとフォーム上部にエラーメッセージが表示されます。

そしてエラーに対応する部分(この場合はcontentの部分)が赤くなっていることがわかります。

f:id:chi_kun:20160407170320p:plain



本日は以上です。