From fa34eec19d63f373bebce5fe12fa0fe823fc4d30 Mon Sep 17 00:00:00 2001 From: leon-joel Date: Thu, 24 Aug 2017 14:15:23 +0900 Subject: [PATCH 1/5] =?UTF-8?q?Ex1.=20=E9=81=8B=E8=B3=83=E3=81=AE=E8=A8=88?= =?UTF-8?q?=E7=AE=97=EF=BC=88=E4=B8=8B=E3=82=8A=EF=BC=89=20Ex2.=20?= =?UTF-8?q?=E9=81=8B=E8=B3=83=E3=81=AE=E8=A8=88=E7=AE=97=EF=BC=88=E4=B8=8A?= =?UTF-8?q?=E3=82=8A=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/gate.rb | 10 +++++++++- test/models/gate_test.rb | 2 -- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/models/gate.rb b/app/models/gate.rb index 6fbdb509..cb000136 100644 --- a/app/models/gate.rb +++ b/app/models/gate.rb @@ -7,7 +7,15 @@ class Gate < ApplicationRecord scope :order_by_station_number, -> { order(:station_number) } + # 当駅で降りられる?=運賃は足りている? def exit?(ticket) - true + # 乗車駅と降車駅(当駅)の区間数 + traveled = (ticket.entered_gate.station_number - self.station_number).abs + + # 区間数から所要運賃を算出 ※traveledが範囲外であることは想定しない + required_fare = FARES[traveled - 1] + + # 切符の額面が所要運賃以上? + required_fare <= ticket.fare end end diff --git a/test/models/gate_test.rb b/test/models/gate_test.rb index e6f39cd6..23faba12 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 From 9d4e2df20a0ef229a6cd792311772b678fefa109 Mon Sep 17 00:00:00 2001 From: leon-joel Date: Thu, 24 Aug 2017 14:20:36 +0900 Subject: [PATCH 2/5] =?UTF-8?q?Ex3.=20=E5=90=8C=E3=81=98=E9=A7=85=E3=81=A7?= =?UTF-8?q?=E9=99=8D=E3=82=8A=E3=82=8B=E5=A0=B4=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/gate.rb | 5 ++++- test/models/gate_test.rb | 1 - 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/models/gate.rb b/app/models/gate.rb index cb000136..a173060e 100644 --- a/app/models/gate.rb +++ b/app/models/gate.rb @@ -9,9 +9,12 @@ class Gate < ApplicationRecord # 当駅で降りられる?=運賃は足りている? def exit?(ticket) - # 乗車駅と降車駅(当駅)の区間数 + # 乗車駅と降車駅(当駅)の区間数 ※station_numberの差=区間数 traveled = (ticket.entered_gate.station_number - self.station_number).abs + # 同じ駅では降りられない + return false if traveled == 0 + # 区間数から所要運賃を算出 ※traveledが範囲外であることは想定しない required_fare = FARES[traveled - 1] 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 0cce92e55d5706f6a56ace9fce615fe6d763e9ed Mon Sep 17 00:00:00 2001 From: leon-joel Date: Thu, 24 Aug 2017 15:28:48 +0900 Subject: [PATCH 3/5] =?UTF-8?q?Ex4.=20=E7=94=BB=E9=9D=A2=E3=81=AE=E5=AE=9F?= =?UTF-8?q?=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/ticket.rb | 11 +++++++++++ test/system/tickets_test.rb | 2 -- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/models/ticket.rb b/app/models/ticket.rb index eac5d011..eacb9633 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.to_i == 0 + + unless exited_gate.exit?(self) + errors.add(:exited_gate, "では降車できません。") + end + 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 8dc941811203e85479aa3ddb8ea8bf81c3981d1e Mon Sep 17 00:00:00 2001 From: leon-joel Date: Thu, 24 Aug 2017 15:48:20 +0900 Subject: [PATCH 4/5] =?UTF-8?q?Ex5.=20=E7=89=B9=E6=AE=8A=E3=82=B1=E3=83=BC?= =?UTF-8?q?=E3=82=B9=E3=81=AE=E5=AE=9F=E8=A3=85=20=E2=80=BB=E9=99=8D?= =?UTF-8?q?=E8=BB=8A=E6=B8=88=E3=81=BF=E5=88=87=E7=AC=A6=E3=81=AE=E5=86=8D?= =?UTF-8?q?=E5=88=A9=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/tickets_controller.rb | 5 +++++ app/models/ticket.rb | 2 +- test/system/tickets_test.rb | 1 - 3 files changed, 6 insertions(+), 2 deletions(-) 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/ticket.rb b/app/models/ticket.rb index eacb9633..e2ff48fd 100644 --- a/app/models/ticket.rb +++ b/app/models/ticket.rb @@ -8,7 +8,7 @@ class Ticket < ApplicationRecord # カスタムvalidation: exited_gate_idの駅で降りられるか? def exited_gate_id_validation - return if exited_gate_id.to_i == 0 + return if exited_gate_id.nil? # 降車駅が指定されていない場合(≒create直後)はスルーする unless exited_gate.exit?(self) errors.add(:exited_gate, "では降車できません。") 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 bb2a51c41c6a0399f779914b20875141a1293cb7 Mon Sep 17 00:00:00 2001 From: leon-joel Date: Thu, 24 Aug 2017 16:10:38 +0900 Subject: [PATCH 5/5] =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/gate.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/models/gate.rb b/app/models/gate.rb index a173060e..a4ddf96c 100644 --- a/app/models/gate.rb +++ b/app/models/gate.rb @@ -7,9 +7,9 @@ class Gate < ApplicationRecord scope :order_by_station_number, -> { order(:station_number) } - # 当駅で降りられる?=運賃は足りている? + # 当駅で降りられる? def exit?(ticket) - # 乗車駅と降車駅(当駅)の区間数 ※station_numberの差=区間数 + # 乗車駅~降車駅(当駅)間の区間数 ※station_numberの差=区間数 traveled = (ticket.entered_gate.station_number - self.station_number).abs # 同じ駅では降りられない @@ -18,7 +18,7 @@ def exit?(ticket) # 区間数から所要運賃を算出 ※traveledが範囲外であることは想定しない required_fare = FARES[traveled - 1] - # 切符の額面が所要運賃以上? + # 切符の額面が所要運賃以上なら降りられる required_fare <= ticket.fare end end