はじめに
大学生限定 プログラミングコミュニティ 『GeekSalon』で活動しているWebメンターの者です!
もし少しでも興味がありましたら、ぜひお話を聞きにきてください!
前提
この記事でできることを紹介します!
バリデーションを使い、すでに投稿されているデータは投稿できないようにする機能をつけます
例)Vaundyについて投稿している人がすでにいる場合、Vaundyについては投稿できないようにする
前提:投稿機能の実装が完了していること
注意モデルはmusic,カラムはcontentになっているので、各々適切なものに修正してください
バリデーションの追加
そもそもバリデーションとは?
投稿フォームで何かを投稿するとき、「入力必須項目」というのを目にしたことはないでしょうか?
例えば「名前やメールアドレス、パスワード」などです。このとき、入力必須項目に何も入力しなかった場合、投稿ができないようにしたいですね。
他にもパスワードなどは4文字以上であるとか、すでにデータベースに存在しているメールアドレスで登録できないようにするとかデータを保存する前に検証したいときもあります。
そんなときに定義するのがバリデーションです。
バリデーションを定義すると、データベースに保存する際、投稿された内容を検証し、保存するかどうかをチェックできるようになります。
今回はcontentカラムを使用し、すでにデータベースに存在しているアーティストを投稿できないようにします。
class Music < ApplicationRecord
#割愛
validates :content, uniqueness: true #追加
#割愛
end
上記のコードでは、validates :content, uniqueness: trueの部分でcontentに一意性制約を設定し、同じアーティストが複数回登録されないようにしています。
新規投稿ページに追加
<%= render 'musics/error_messages', model: f.object %> #追加
フォームの下部にエラーメッセージを表示するためのものです。<%= render 'musics/error_messages', model: f.object %> の部分は、f.object が表すオブジェクト(@music などのモデルインスタンス)のエラーメッセージを表示するために使用されます。
具体的には、error_messages ビューパーシャルファイル内で、f.object に関連するエラーメッセージが存在する場合、それらのエラーメッセージをリストとして表示します。エラーメッセージは通常、バリデーションエラーが発生した場合に表示され、ユーザーにエラーの内容を伝えるのに役立ちます。
この行を追加することで、ユーザーがフォームを送信した際に入力エラーが発生した場合に、エラーメッセージがフォームの下部に表示されるようになります。
エラーメッセージページを作成
<% if model.errors.any? %>
<div class="alert alert-warning">
<ul>
<% model.errors.full_messages.each do |message| %>
<h2>すでに存在するデータです</h2>
<% end %>
</ul>
</div>
<% end %>
新規投稿ページで追加した1行は、エラーが出た場合こちらのビューファイルが表示されます。今回はすでに存在するデータがある場合「すでに存在するデータです」と表示させるようにします。
コントローラーの変更
def create
# データベース内に同じ content 値が存在するか確認
if Music.exists?(content: music_params[:content])
@music = Music.new
@music.errors.add(:content, "アーティスト名はすでに存在します")
render :new
else
@music = Music.new(music_params)
if @music.save
# ここにリダイレクトのコードを追加
else
render :new
end
end
end
このコードは、アーティスト名の重複をチェックし、データベース内に同じアーティスト名が存在しない場合に新しい音楽情報を保存します。もし保存に失敗した場合、render :new が実行されて、フォームが再表示されます。リダイレクトは各々のコードを追加してみてください。
完成図はこんな感じです!お疲れ様でした!