diff --git a/app/controllers/tickets_controller.rb b/app/controllers/tickets_controller.rb index 30b6e6f5..c53336a0 100644 --- a/app/controllers/tickets_controller.rb +++ b/app/controllers/tickets_controller.rb @@ -45,5 +45,10 @@ def ticket_update_params def load_ticket @ticket = Ticket.find(params[:id]) + + unless @ticket.exited_gate.nil? + flash[:error] = "降車済みの切符です。" + redirect_to root_path + end end end diff --git a/app/models/gate.rb b/app/models/gate.rb index 6fbdb509..a4ddf96c 100644 --- a/app/models/gate.rb +++ b/app/models/gate.rb @@ -7,7 +7,18 @@ class Gate < ApplicationRecord scope :order_by_station_number, -> { order(:station_number) } + # 当駅で降りられる? def exit?(ticket) - true + # 乗車駅~降車駅(当駅)間の区間数 ※station_numberの差=区間数 + traveled = (ticket.entered_gate.station_number - self.station_number).abs + + # 同じ駅では降りられない + return false if traveled == 0 + + # 区間数から所要運賃を算出 ※traveledが範囲外であることは想定しない + required_fare = FARES[traveled - 1] + + # 切符の額面が所要運賃以上なら降りられる + required_fare <= ticket.fare end end diff --git a/app/models/ticket.rb b/app/models/ticket.rb index eac5d011..e2ff48fd 100644 --- a/app/models/ticket.rb +++ b/app/models/ticket.rb @@ -3,4 +3,15 @@ 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 + validate :exited_gate_id_validation + + + # カスタムvalidation: exited_gate_idの駅で降りられるか? + def exited_gate_id_validation + return if exited_gate_id.nil? # 降車駅が指定されていない場合(≒create直後)はスルーする + + unless exited_gate.exit?(self) + errors.add(:exited_gate, "では降車できません。") + 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)