前提・実現したいこと
同じ組み合わせで登録しようとすると指定のページに飛ぶような処理をしたいです。自分なりに実装してみたのですが、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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。