おはようございます!
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>