Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Answer by okeicalm #27

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
20 changes: 18 additions & 2 deletions app/controllers/tickets_controller.rb
Expand Up @@ -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
Expand All @@ -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
23 changes: 22 additions & 1 deletion app/models/gate.rb
Expand Up @@ -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
8 changes: 8 additions & 0 deletions app/models/ticket.rb
Expand Up @@ -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
3 changes: 0 additions & 3 deletions test/models/gate_test.rb
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
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