From 8ae8f8738643f7b8d72bb8ad0864b3997af2a8f2 Mon Sep 17 00:00:00 2001 From: sinsoku Date: Tue, 1 Aug 2017 00:36:40 +0900 Subject: [PATCH 1/8] :sparkles: Fix a test for Ex1 --- app/models/gate.rb | 4 +++- test/models/gate_test.rb | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/models/gate.rb b/app/models/gate.rb index 6fbdb509..645e29af 100644 --- a/app/models/gate.rb +++ b/app/models/gate.rb @@ -8,6 +8,8 @@ class Gate < ApplicationRecord scope :order_by_station_number, -> { order(:station_number) } def exit?(ticket) - true + section = (station_number - ticket.entered_gate.station_number).abs + price = FARES[section - 1] + ticket.fare - price >= 0 end end diff --git a/test/models/gate_test.rb b/test/models/gate_test.rb index e6f39cd6..3de68b35 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 From a4d5d32d765b1ff62b3b18bb0f525571f1b700b4 Mon Sep 17 00:00:00 2001 From: sinsoku Date: Tue, 1 Aug 2017 00:43:13 +0900 Subject: [PATCH 2/8] :recycle: Extract a method --- app/models/gate.rb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/models/gate.rb b/app/models/gate.rb index 645e29af..698788a4 100644 --- a/app/models/gate.rb +++ b/app/models/gate.rb @@ -8,8 +8,13 @@ class Gate < ApplicationRecord scope :order_by_station_number, -> { order(:station_number) } def exit?(ticket) + ticket.fare - calculate(ticket) >= 0 + end + + private + + def calculate(ticket) section = (station_number - ticket.entered_gate.station_number).abs - price = FARES[section - 1] - ticket.fare - price >= 0 + FARES[section - 1] end end From 84447f512ac3249f9c43b46e14e8677dbcdb8be1 Mon Sep 17 00:00:00 2001 From: sinsoku Date: Tue, 1 Aug 2017 00:46:17 +0900 Subject: [PATCH 3/8] :sparkles: Fix a test for Ex2 --- test/models/gate_test.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/test/models/gate_test.rb b/test/models/gate_test.rb index 3de68b35..23faba12 100644 --- a/test/models/gate_test.rb +++ b/test/models/gate_test.rb @@ -45,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 From 298affcf19c5573c4967eb2c8d2f6588401ec956 Mon Sep 17 00:00:00 2001 From: sinsoku Date: Tue, 1 Aug 2017 00:49:32 +0900 Subject: [PATCH 4/8] :sparkles: Fix a test for Ex3 --- app/models/gate.rb | 5 +++-- test/models/gate_test.rb | 1 - 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/models/gate.rb b/app/models/gate.rb index 698788a4..71dd1116 100644 --- a/app/models/gate.rb +++ b/app/models/gate.rb @@ -8,13 +8,14 @@ class Gate < ApplicationRecord scope :order_by_station_number, -> { order(:station_number) } def exit?(ticket) - ticket.fare - calculate(ticket) >= 0 + price = calculate(ticket) + price > 0 && ticket.fare - price >= 0 end private def calculate(ticket) section = (station_number - ticket.entered_gate.station_number).abs - FARES[section - 1] + section > 0 ? FARES[section - 1] : 0 end end diff --git a/test/models/gate_test.rb b/test/models/gate_test.rb index 23faba12..53b94569 100644 --- a/test/models/gate_test.rb +++ b/test/models/gate_test.rb @@ -61,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) From fc37eb4232658bd50b4494a8f689d0df304d988b Mon Sep 17 00:00:00 2001 From: sinsoku Date: Tue, 1 Aug 2017 01:03:13 +0900 Subject: [PATCH 5/8] :sparkles: Fix a test for Ex4 --- app/models/ticket.rb | 8 ++++++++ test/system/tickets_test.rb | 2 -- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/models/ticket.rb b/app/models/ticket.rb index eac5d011..c1cb8f64 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 + + 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/system/tickets_test.rb b/test/system/tickets_test.rb index 64c7bdc6..09efbbeb 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: '乗車駅' From f41ce2fab5f91acf2ec6f7d5a2da6c1d4e15c598 Mon Sep 17 00:00:00 2001 From: sinsoku Date: Tue, 1 Aug 2017 01:22:05 +0900 Subject: [PATCH 6/8] :sparkles: Fix a test for Ex5 --- app/controllers/tickets_controller.rb | 1 + test/system/tickets_test.rb | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) 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/test/system/tickets_test.rb b/test/system/tickets_test.rb index 09efbbeb..fa7befd6 100644 --- a/test/system/tickets_test.rb +++ b/test/system/tickets_test.rb @@ -38,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) From 29fbf2c5664707aab532788c0c46de9fce044196 Mon Sep 17 00:00:00 2001 From: sinsoku Date: Tue, 1 Aug 2017 01:26:46 +0900 Subject: [PATCH 7/8] :recycle: Fix missing newline --- test/system/tickets_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/system/tickets_test.rb b/test/system/tickets_test.rb index fa7befd6..b435a895 100644 --- a/test/system/tickets_test.rb +++ b/test/system/tickets_test.rb @@ -64,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 From 176456a100a8008ff3ebac3cfcf0ced3f19a2f93 Mon Sep 17 00:00:00 2001 From: sinsoku Date: Tue, 1 Aug 2017 01:31:26 +0900 Subject: [PATCH 8/8] :recycle: Use optional instead of required Because the rquired option is deprecated from Rails v5.0. see also: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-belongs_to --- app/models/ticket.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/ticket.rb b/app/models/ticket.rb index c1cb8f64..b314ab66 100644 --- a/app/models/ticket.rb +++ b/app/models/ticket.rb @@ -1,6 +1,6 @@ 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