LoginSignup
2
1

More than 1 year has passed since last update.

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

Last updated at Posted at 2019-07-17

おはようございます!
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の学習をしています。
記載内容に不備・不足があればご指摘いただけると幸いです。
至らぬ点ばかりですので、改善点がありましたらどんどんご指摘下さい!

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