From d8b87ac73fce6436386f309ade70d4964f4966d7 Mon Sep 17 00:00:00 2001 From: okeicalm Date: Tue, 15 Aug 2017 13:44:03 +0900 Subject: [PATCH] Answer by okeicalm --- app/controllers/tickets_controller.rb | 20 ++++++++++++++++++-- app/models/gate.rb | 23 ++++++++++++++++++++++- app/models/ticket.rb | 8 ++++++++ test/models/gate_test.rb | 3 --- test/system/tickets_test.rb | 3 --- 5 files changed, 48 insertions(+), 9 deletions(-) diff --git a/app/controllers/tickets_controller.rb b/app/controllers/tickets_controller.rb index 30b6e6f5..cd59d122 100644 --- a/app/controllers/tickets_controller.rb +++ b/app/controllers/tickets_controller.rb @@ -23,12 +23,20 @@ def show end def edit + load_ticket + redirect_to root_path, notice: '降車済みの切符です。' if @ticket.used? end def update - if @ticket.update(ticket_update_params) - redirect_to root_path, notice: '降車しました。😄' + load_ticket + exited_gate = Gate.find(ticket_update_params[:exited_gate_id]) + + if @ticket.used? + redirect_to root_path, notice: '降車済みの切符です。' if @ticket.used? + elsif exited_gate.exit?(@ticket) + update_ticket else + @ticket.errors[:base] << '降車駅 では降車できません。' render :edit end end @@ -46,4 +54,12 @@ def ticket_update_params def load_ticket @ticket = Ticket.find(params[:id]) end + + def update_ticket + if @ticket.update(ticket_update_params) + redirect_to root_path, notice: '降車しました。😄' + else + render :edit + end + end end diff --git a/app/models/gate.rb b/app/models/gate.rb index 6fbdb509..62057491 100644 --- a/app/models/gate.rb +++ b/app/models/gate.rb @@ -8,6 +8,27 @@ class Gate < ApplicationRecord scope :order_by_station_number, -> { order(:station_number) } def exit?(ticket) - true + gate_interval = fetch_gate_interval(ticket.entered_gate_id) + + # 運賃不足ではないかチェック + if gate_interval.zero? + false + elsif FARES[gate_interval - 1] <= ticket.fare + true + else + false + end + end + + private + + def fetch_gate_interval(entered_gate_id) + ( + entered_station_number(entered_gate_id) - station_number + ).abs + end + + def entered_station_number(gate_id) + Gate.find(gate_id).station_number end end diff --git a/app/models/ticket.rb b/app/models/ticket.rb index eac5d011..c7c71295 100644 --- a/app/models/ticket.rb +++ b/app/models/ticket.rb @@ -3,4 +3,12 @@ class Ticket < ApplicationRecord belongs_to :exited_gate, class_name: 'Gate', foreign_key: 'exited_gate_id', required: false validates :fare, presence: true, inclusion: Gate::FARES validates :entered_gate_id, presence: true + + def used? + if exited_gate_id.nil? + false + else + true + end + end end diff --git a/test/models/gate_test.rb b/test/models/gate_test.rb index e6f39cd6..53b94569 100644 --- a/test/models/gate_test.rb +++ b/test/models/gate_test.rb @@ -19,7 +19,6 @@ class GateTest < ActiveSupport::TestCase end test 'うめだで150円の切符を買って、みくにで降りる(運賃不足)' do - skip 'Please implement this!' ticket = Ticket.create!(fare: 150, entered_gate: @umeda) refute @mikuni.exit?(ticket) end @@ -46,7 +45,6 @@ class GateTest < ActiveSupport::TestCase end test 'みくにで150円の切符を買って、うめだで降りる(運賃不足)' do - skip 'Please implement this!' ticket = Ticket.create!(fare: 150, entered_gate: @mikuni) refute @umeda.exit?(ticket) end @@ -63,7 +61,6 @@ class GateTest < ActiveSupport::TestCase # その他 test '同じ駅では降りられない' do - skip 'Please implement this!' ticket = Ticket.create!(fare: 190, entered_gate: @umeda) refute @umeda.exit?(ticket) diff --git a/test/system/tickets_test.rb b/test/system/tickets_test.rb index 64c7bdc6..fa7befd6 100644 --- a/test/system/tickets_test.rb +++ b/test/system/tickets_test.rb @@ -14,7 +14,6 @@ class TicketsTest < ApplicationSystemTestCase end test '運賃が足りない場合' do - skip 'Please implement this!' visit root_path select '150円', from: '切符' select 'うめだ', from: '乗車駅' @@ -27,7 +26,6 @@ class TicketsTest < ApplicationSystemTestCase end test '同じ駅で降りる場合' do - skip 'Please implement this!' visit root_path select '150円', from: '切符' select 'うめだ', from: '乗車駅' @@ -40,7 +38,6 @@ class TicketsTest < ApplicationSystemTestCase end test 'すでに使用済みの切符を指定されたらトップページに移動する' do - skip 'Please implement this!' # edit ticket = Ticket.create!(fare: 150, entered_gate: gates(:umeda), exited_gate: gates(:juso)) visit edit_ticket_path(ticket)