質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

2076閲覧

unique: trueをしたのですが、elseの処理がされずコンソールで保存できなかったエラーメッセージが表示されるだけになってしまう

ryousukesatou

総合スコア19

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

2グッド

1クリップ

投稿2020/01/17 05:10

前提・実現したいこと

僕はgenreのマイグレーションファイルでunique: tureの設定をしてmigrateしたので、genre.saveの処理は成功せず失敗してelseの処理をするはずですが、それが実行されず、ActiveRecord::RecordNotUniqueというエラーになってしまいます。これはビューでは表示されずターミナルだけでの表示になってしまいます。
どうすればいいのでしょうか?

発生している問題・エラーメッセージ

ActiveRecord::RecordNotUnique (SQLite3::ConstraintException: UNIQUE constraint failed: genres.name: INSERT INTO "genres" ("name", "created_at", "updated_at") VALUES (?, ?, ?)): app/controllers/end_user/genres_controller.rb:18:in `block in create' app/controllers/end_user/genres_controller.rb:17:in `create'

該当のソースコード

ruby

1 db/migrate/20200112101444_create_genres.rb 2 3class CreateGenres < ActiveRecord::Migration[5.2] 4 def change 5 create_table :genres do |t| 6 t.string :name, null: false 7 t.timestamps 8 t.index :name, unique: true 9 end 10 end 11end 12

ruby

1 app/views/end_user/posts/_checkboxes.html.erb 2 3<%= form_with url: end_user_genres_path, model: @genre, remote: true do |f| %> 4 <div class="col-sm-6 col-sm-offset-3 form-group" > 5 <label>Genre : </label> 6 <%= f.text_field :name %> 7 <%= f.submit 'ジャンルを追加' %> 8 </div> 9<% end %>

ruby

1 app/controllers/end_user/genres_controller.rb 2 3class EndUser::GenresController < ApplicationController 4 def index 5 @user = current_user 6 @genres = Genre.all 7 end 8 9 def show 10 @user = current_user 11 @posts = Genre.find_by(params[:id]).posts.page(params[:page]).reverse_order 12 @comment = Comment.new 13 end 14 15 def create 16 @genre = Genre.new(genre_params) 17 @genres = Genre.all 18 @post = Post.new 19 respond_to do |format| 20 if @genre.save 21 format.html 22 format.js 23 else 24 format.js {render 'fail'} 25 end 26 end 27 end 28 29 private 30 def genre_params 31 params.require(:genre).permit(:name) 32 end 33end 34

試したこと

試したことはないのですが、unique: trueをつけないとうまく動きます。

補足情報(FW/ツールのバージョンなど)

バージョン
ruby : 2.5.5
rails : 5.2.3

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

unique: trueデータベース側の設定ですので、Railsで何も仕掛けないとそのまま重複したデータがデータベースまで行って、データベースエラーで止まる、という動作となってしまいます。

きちんとRailsでハンドルしたいのなら、Rails内のバリデーションとして、validates :name, uniqueness: trueのようなものをモデルに仕掛けましょう。

投稿2020/01/17 05:13

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryousukesatou

2020/01/17 05:46

ありがとうございます。無事実装できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問