Posted at

validationで成功・失敗の時の画面遷移を条件分岐で書く

おはようございます!

validationを使う時に少しハマったので備忘録です。


validation

valiationとはmodelの検証を定義する(rails公式ドキュメントより)

今回使うのはpresenceで空の値ではない事を検証します。


基本型

validates :カラム名, presence: 検証パラメーター



まずはvalidatesを設定


models/post.rb

class Post < ApplicationRecord

belongs_to :user
validates :content, :title, presence: true
//content,titleもしくは両方の値が空の場合はデータベースには保存されない
end


ハマったポイント

modelにvalidatesを設定したので確かにベータベースに空の値は保存されていないんだけど、ビューは成功時も失敗時も同じ遷移をしていて「なぜ?」と初学者丸出しのミスをしました。


ビューを成功時と失敗時に分ける処理

modelは問題なく処理ができているのでビューの処理を分けたいのでcontrollerを設定する必要がる


posts_controller.rb

class PostsController < ApplicationController

 ~省略〜
def new
end

def create
//今回のvalidationは新規投稿する時に検証したいのでcreateアクション内
  @post = Post.create(content: post_params[:content], title: post_params[:title], user_id: current_user.id)
//createアクションが動いて入力された値は@postにセットされる
if @post.save
redirect_to :root
//validationで成功した場合はrootパスへリダイレクトする
else
render 'new'
//失敗した時はそのまま投稿画面がrenderで回される
end

def post_params
params.require(:post).permit(:content, :title)
end
end


このif文の処理で画面遷移の行き先を分岐できた。しかしこのままだと失敗した時にエラーの通知が画面に表示されずに不便なので新規投稿が失敗した事を通知させる。


エラー通知


new.html.erb

<div "contents row">

<% if @post.errors.any? %>
<p>
タイトルか本文が未入力です</p>
/
/.errors.any?によってvalidationが失敗した時にエラー文を画面に表示
<% end %>
~省略~
</div>


まとめ




model



何をvalidationするか設定する





controller



処理の成功・失敗を動かしたいアクション内で条件分岐させる



view



.error.any?を使って失敗した時のエラー文を表示させる



以上でvalidationが設定できました!



筆者について

TEXH::EXPERT渋谷校の夜間クラスで4月からRuby・Railsの学習をしています。

記載内容に不備・不足があればご指摘いただけると幸いです。

至らぬ点ばかりですので、改善点がありましたらどんどんご指摘下さい!