diff --git a/app/controllers/tickets_controller.rb b/app/controllers/tickets_controller.rb index 30b6e6f5..e93a8cd4 100644 --- a/app/controllers/tickets_controller.rb +++ b/app/controllers/tickets_controller.rb @@ -45,5 +45,6 @@ def ticket_update_params def load_ticket @ticket = Ticket.find(params[:id]) + redirect_to root_path, alert: '降車済みの切符です。' if @ticket.exited_gate_id end end diff --git a/app/models/gate.rb b/app/models/gate.rb index 6fbdb509..71dd1116 100644 --- a/app/models/gate.rb +++ b/app/models/gate.rb @@ -8,6 +8,14 @@ class Gate < ApplicationRecord scope :order_by_station_number, -> { order(:station_number) } def exit?(ticket) - true + price = calculate(ticket) + price > 0 && ticket.fare - price >= 0 + end + + private + + def calculate(ticket) + section = (station_number - ticket.entered_gate.station_number).abs + section > 0 ? FARES[section - 1] : 0 end end diff --git a/app/models/ticket.rb b/app/models/ticket.rb index eac5d011..b314ab66 100644 --- a/app/models/ticket.rb +++ b/app/models/ticket.rb @@ -1,6 +1,14 @@ class Ticket < ApplicationRecord belongs_to :entered_gate, class_name: 'Gate', foreign_key: 'entered_gate_id' - belongs_to :exited_gate, class_name: 'Gate', foreign_key: 'exited_gate_id', required: false + belongs_to :exited_gate, class_name: 'Gate', foreign_key: 'exited_gate_id', optional: true validates :fare, presence: true, inclusion: Gate::FARES validates :entered_gate_id, presence: true + + validate :must_be_exit, if: :exited_gate_id + + private + + def must_be_exit + errors.add(:exited_gate, 'では降車できません。') unless exited_gate.exit?(self) + 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..b435a895 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) @@ -67,4 +64,4 @@ class TicketsTest < ApplicationSystemTestCase visit ticket_path(ticket) assert_current_path edit_ticket_path(ticket) end -end \ No newline at end of file +end