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

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

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

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

Ruby on Rails 6

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

Q&A

解決済

1回答

692閲覧

同じ値を登録しようとすると指定のページに遷移してほしい。

kaji120

総合スコア39

Ruby

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

Ruby on Rails 6

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

0グッド

0クリップ

投稿2021/10/12 12:34

前提・実現したいこと

同じ組み合わせで登録しようとすると指定のページに飛ぶような処理をしたいです。自分なりに実装してみたのですが、Rspecのテストが通らずに悩んでいます。
同じ値の時は保存できず指定のページに遷移するので問題ないという認識です。
かれこれだいぶ悩んでおります。よろしくお願いします。

発生している問題

ActiveRecord::RecordNotFound │ │ Couldn't find Movie with 'id'=72

該当のソースコード

Rspec

rb

1ソースコード 2RSpec.describe ReservationsController, type: :controller do 3 render_views 4 describe 'Station10 GET /movies/:movie_id/schedules/:schedule_id/reservations/new' do 5 let!(:movie) { create(:movie) } 6 let!(:sheets) { create_list(:sheet, 5) } 7 let!(:schedule) { create(:schedule, movie_id: movie.id) } 8 let!(:success_request) { get :new, params: { date: "2019-04-16", sheet_id: sheets.first.id , movie_id: movie.id, schedule_id: schedule.id }, session: {} } 9 let!(:failure_request) { get :new, params: { movie_id: movie.id, schedule_id: schedule.id }, session: {} } 10・・・ 11 12 describe 'Station10 POST /reservation/' do 13 let!(:movie) { create(:movie) } 14 let!(:sheets) { create_list(:sheet, 5) } 15 let!(:schedule) { create(:schedule, movie_id: movie.id) } 16 17・・・ 18 it 'DBのunique制約にかかったときに座席一覧に飛ぶ' do 19 # 同じ日付の同じ映画の座席を予約してみる 20 create(:reservation, { sheet_id: sheets.first.id, schedule_id: schedule.id, date: "2019-04-16" }) 21 post :create, params: { reservation: { name: "TEST_NAME", email: "test@test.com", date: "2019-04-16", sheet_id: sheets.first.id , schedule_id: schedule.id, movie_id: movie.id }}, session: {} 22 expect(response).to redirect_to("http://test.host/movies/#{movie.id}/schedules/#{schedule.id}/sheets?date=2019-04-16") 23 end 24 end 25end 26

ReservationsController

def create @reservation = Reservation.new(reservation_params) if @reservation.save redirect_to movies_path else @movie_id = Movie.find(reservation_params[:schedule_id]).id redirect_to movie_schedule_sheets_path(schedule_id: reservation_params[:schedule_id], movie_id: @movie_id, date: reservation_params[:date]), status: 400 end end private def reservation_params params.require(:reservation).permit(:name, :email, :date, :sheet_id, :schedule_id) end

model

#ReservationはSheetとScheduleに関連付けられています。 class Reservation < ApplicationRecord belongs_to :sheet belongs_to :schedule VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+.[a-z]+\z/i validates :email, presence: true, length: { maximum: 255 }, format: { with: VALID_EMAIL_REGEX } validates :date, presence: true, uniqueness: {scppe: :sheet_id } validates :schedule_id, presence: true validates :sheet_id, presence: true, uniqueness: {scppe: :data } end

試したこと

・modelにuniqueness: {scppe: :sheet_id }と  uniqueness: {scppe: :data }を追加して同じ組み合わせで保存できないようにしました。

・controller createのelseの後の処理でredirect_to movie_schedule_sheets_path(schedule_id: reservation_params[:schedule_id], movie_id: @movie_id, date: reservation_params[:date]), status: 400を追加することにより指定のページに遷移するようにしました。実際に問題なく遷移します。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

なぜ Movie を schedule_id で検索しているのでしょうか?
Movie.find(reservation_params[:schedule_id])

ID で検索して ID を取り出しているのも不自然に感じます。
Movie.find(reservation_params[:schedule_id]).id

もし create に対応するパスが以下であるならば
POST /movies/:movie_id/schedules/:schedule_id/reservations
Movie の ID は params[:movie_id] で取り出せるはずです。

POST /reservations で Schedule belongs_to :movie なら以下のようになります。

ruby

1else 2 # いまは validates :date, presence: true, uniqueness: { scppe: :sheet_id } 以外のエラーは考えない 3 schedule = Schedule.find(reservation_params[:schedule_id]) 4 movie_id = schedule.movie.id 5 6 redirect_to movie_schedule_sheets_path(schedule_id: schedule.id, movie_id: movie_id, date: reservation_params[:date]), status: 400 7end

投稿2021/10/12 13:11

neko_daisuki

総合スコア2090

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問