バリデーションとは?
レコードをテーブルに保存する時には、値が正しいかどうかの検証が必要になります。この検証を簡単にこなすのがRailsに用意されたバリデーション(validatesメソッド)です。
バリデーションの書き方と具体例
①Railsアプリケーションフォルダのapp/models/___.rbにソースコードを記述
validates :title, presence: true
validates :body, presence: true,length: {maximum: 200 }
【意味】バリデーションによって、空白のデータが入力されていなければ、saveメソッドでfalseが返される。
【詳細】
⇒(title)と(body)に「presence: true」を指定することで「空白を禁止(値を必ず入れなければいけない)」という指定を行います。
⇒length: {maximum: 100 }というものを設けて最大値を設定することもできる。反対にminimum:2(最低でも2文字以上入力が必要)で最低数も設定できる。
②コントローラで設定を行う
def create
@book = Book.new(book_params)
if@book.save
redirect_to book_path(@book)
else
render 'index'
end
end
【意味】新規投稿などでデータを作成する際にアクションとしてcreateが作動します。その時に入力フォームに不備がある場合の処理方法をコントローラーに記載。
【詳細】
if@book.save
redirect_to book_path(@book)
⇒もし保存することができる場合には、投稿を保存後book_path(@user)へ移動します。今回は投稿した際にbook/1に遷移したいためこのような設定。
※ルートパスは随時確認して設定する必要がある。
else
render 'index'
⇒入力フォームに問題があり保存ができないと判断された場合の処理を書くところ。renderでコントローラーの処理を返さず直接indexの表示画面へ遷移します。その他newなど設定可能。
③viewページへエラー分を表示することを書く
バリデーションの記述が行われても、エラーの内容が表示されません。次が最後エラーの内容が確認できるようする。
<% if @book.errors.any? %>
<h3><%= @book.errors.count %>errors prohibited this obj from being saved:</h3>
<% @book.errors.full_messages.each do |message| %>
<ul><li>
<%= message %>
</li>
</ul>
<% end %>
<% end %>
【詳細】
<% if @book.errors.any? %>
⇒errors.any?は、発生したエラーの内容を確認できany?と組み合わせることで、エラーの判定できる。
<%= @book.errors.count %>errors prohibited this obj from being saved:
⇒errors.countでエラーの個数を表示してくれます。%>以降では表示したい文字を記入する。(例)<%= @book.errors.count %>個エラーがあります。
<% @book.errors.full_messages.each do |message| %>
⇒また、full_messageと組み合わせることで、エラーの内容を出力できます。
エラー文は配列で保存されているため、eachを使う。