Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions app/controllers/tickets_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
13 changes: 12 additions & 1 deletion app/models/gate.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
11 changes: 11 additions & 0 deletions app/models/ticket.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
3 changes: 0 additions & 3 deletions test/models/gate_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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)

Expand Down
3 changes: 0 additions & 3 deletions test/system/tickets_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ class TicketsTest < ApplicationSystemTestCase
end

test '運賃が足りない場合' do
skip 'Please implement this!'
visit root_path
select '150円', from: '切符'
select 'うめだ', from: '乗車駅'
Expand All @@ -27,7 +26,6 @@ class TicketsTest < ApplicationSystemTestCase
end

test '同じ駅で降りる場合' do
skip 'Please implement this!'
visit root_path
select '150円', from: '切符'
select 'うめだ', from: '乗車駅'
Expand All @@ -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)
Expand Down