1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Ruby】すでに投稿されているものを投稿できないようにする

Posted at

はじめに

大学生限定 プログラミングコミュニティ 『GeekSalon』で活動しているWebメンターの者です!
もし少しでも興味がありましたら、ぜひお話を聞きにきてください!

前提

この記事でできることを紹介します!
バリデーションを使い、すでに投稿されているデータは投稿できないようにする機能をつけます

例)Vaundyについて投稿している人がすでにいる場合、Vaundyについては投稿できないようにする

前提:投稿機能の実装が完了していること

注意モデルはmusic,カラムはcontentになっているので、各々適切なものに修正してください

バリデーションの追加

そもそもバリデーションとは?
投稿フォームで何かを投稿するとき、「入力必須項目」というのを目にしたことはないでしょうか?

例えば「名前やメールアドレス、パスワード」などです。このとき、入力必須項目に何も入力しなかった場合、投稿ができないようにしたいですね。

他にもパスワードなどは4文字以上であるとか、すでにデータベースに存在しているメールアドレスで登録できないようにするとかデータを保存する前に検証したいときもあります。

そんなときに定義するのがバリデーションです。
バリデーションを定義すると、データベースに保存する際、投稿された内容を検証し、保存するかどうかをチェックできるようになります。

今回はcontentカラムを使用し、すでにデータベースに存在しているアーティストを投稿できないようにします。

music.rb
class Music < ApplicationRecord
    #割愛
    validates :content, uniqueness: true #追加
    #割愛
end

上記のコードでは、validates :content, uniqueness: trueの部分でcontentに一意性制約を設定し、同じアーティストが複数回登録されないようにしています。

新規投稿ページに追加

new.html.erb
 <%= render 'musics/error_messages', model: f.object %> #追加

フォームの下部にエラーメッセージを表示するためのものです。<%= render 'musics/error_messages', model: f.object %> の部分は、f.object が表すオブジェクト(@music などのモデルインスタンス)のエラーメッセージを表示するために使用されます。

具体的には、error_messages ビューパーシャルファイル内で、f.object に関連するエラーメッセージが存在する場合、それらのエラーメッセージをリストとして表示します。エラーメッセージは通常、バリデーションエラーが発生した場合に表示され、ユーザーにエラーの内容を伝えるのに役立ちます。

この行を追加することで、ユーザーがフォームを送信した際に入力エラーが発生した場合に、エラーメッセージがフォームの下部に表示されるようになります。

エラーメッセージページを作成

_error_messages.html.erb
<% if model.errors.any? %>
  <div class="alert alert-warning">
    <ul>
      <% model.errors.full_messages.each do |message| %>
       <h2>すでに存在するデータです</h2>
      <% end %>
    </ul>
  </div>
<% end %>

新規投稿ページで追加した1行は、エラーが出た場合こちらのビューファイルが表示されます。今回はすでに存在するデータがある場合「すでに存在するデータです」と表示させるようにします。

コントローラーの変更

musics_controller.rb
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 が実行されて、フォームが再表示されます。リダイレクトは各々のコードを追加してみてください。

完成図はこんな感じです!お疲れ様でした!

タイトルなし.gif

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?