Skip to content

Commit 0b0e6c0

Browse files
committed
feat: Move /events/latest to /dojos/activity following Rails Way
- RESTfulなURLパターンに従い、道場の活動状況を /dojos/activity に移動 - 情報アーキテクチャの改善(道場関連は/dojos配下に統一) - 旧URL (/events/latest) から新URLへの301リダイレクトを設定 - テストを追加(最小限の実装、YAGNI原則に従う)
1 parent 2bc0d97 commit 0b0e6c0

File tree

5 files changed

+84
-42
lines changed

5 files changed

+84
-42
lines changed

app/controllers/dojos_controller.rb

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,4 +105,39 @@ def show
105105
format.csv { send_data render_to_string, type: :csv }
106106
end
107107
end
108+
109+
# GET /dojos/activity
110+
# 道場の活動状況を表示(旧 /events/latest から移行)
111+
def activity
112+
@latest_event_by_dojos = []
113+
Dojo.active.each do |dojo|
114+
link_in_note = dojo.note.match(URI.regexp)
115+
date_in_note = dojo.note.match(/(\d{4}-\d{1,2}-\d{1,2})/) # YYYY-MM-DD
116+
last_session_link = link_in_note.nil? ? dojo_path(dojo.id) : link_in_note.to_s
117+
last_session_date = date_in_note.nil? ? dojo.created_at : Time.zone.parse(date_in_note.to_s)
118+
119+
latest_event = dojo.event_histories.newest.first
120+
latest_event_at = latest_event.nil? ? Time.zone.parse('2000-01-23') : latest_event.evented_at
121+
@latest_event_by_dojos << {
122+
id: dojo.id,
123+
name: dojo.name,
124+
note: dojo.note,
125+
url: dojo.url,
126+
has_event_histories: latest_event.nil?,
127+
128+
# 過去のイベント開催日と note 内の日付を比較し、新しい方の日付を表示
129+
event_at: (latest_event_at < last_session_date) ?
130+
last_session_date.strftime("%Y-%m-%d") :
131+
latest_event.evented_at.strftime("%Y-%m-%d"),
132+
133+
# 過去のイベント開催日と note 内の日付を比較し、新しい方のリンクを表示
134+
event_url: (latest_event_at < last_session_date) ?
135+
last_session_link :
136+
latest_event.event_url
137+
}
138+
end
139+
140+
# Sort by older events first && older Dojo ID first if same event date.
141+
@latest_event_by_dojos.sort_by!{ |dojo| [dojo[:event_at], dojo[:id]] }
142+
end
108143
end

app/controllers/events_controller.rb

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -13,42 +13,4 @@ def index
1313
}
1414
end
1515
end
16-
17-
def latest
18-
# 現在はノートで細かな確認ができるため不要? (念のため残しています)
19-
# @active_dojos_verified = [
20-
# '和歌山', '市川真間', '泉', '石垣', '南紀田辺', '三好', '市川', 'ひばりヶ丘', '伊勢',
21-
# '徳島', '柏', '富山', 'ももち', '木曽', '熊本'
22-
# ]
23-
@latest_event_by_dojos = []
24-
Dojo.active.each do |dojo|
25-
link_in_note = dojo.note.match(URI.regexp)
26-
date_in_note = dojo.note.match(/(\d{4}-\d{1,2}-\d{1,2})/) # YYYY-MM-DD
27-
last_session_link = link_in_note.nil? ? dojo_path(dojo.id) : link_in_note.to_s
28-
last_session_date = date_in_note.nil? ? dojo.created_at : Time.zone.parse(date_in_note.to_s)
29-
30-
latest_event = dojo.event_histories.newest.first
31-
latest_event_at = latest_event.nil? ? Time.zone.parse('2000-01-23') : latest_event.evented_at
32-
@latest_event_by_dojos << {
33-
id: dojo.id,
34-
name: dojo.name,
35-
note: dojo.note,
36-
url: dojo.url,
37-
has_event_histories: latest_event.nil?,
38-
39-
# 過去のイベント開催日と note 内の日付を比較し、新しい方の日付を表示
40-
event_at: (latest_event_at < last_session_date) ?
41-
last_session_date.strftime("%Y-%m-%d") :
42-
latest_event.evented_at.strftime("%Y-%m-%d"),
43-
44-
# 過去のイベント開催日と note 内の日付を比較し、新しい方のリンクを表示
45-
event_url: (latest_event_at < last_session_date) ?
46-
last_session_link :
47-
latest_event.event_url
48-
}
49-
end
50-
51-
# Sort by older events first && older Dojo ID first if same event date.
52-
@latest_event_by_dojos.sort_by!{ |dojo| [dojo[:event_at], dojo[:id]] }
53-
end
5416
end

app/views/events/latest.html.erb renamed to app/views/dojos/activity.html.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<% provide(:title, '道場情報 - 直近の開催日まとめ') %>
22
<% provide(:desc, '道場別の直近開催日をまとめたページです。') %>
3-
<% provide(:url, events_latest_url) %>
3+
<% provide(:url, activity_dojos_url) %>
44
<% provide(:meta_image, '/img/ogp-events.jpeg') %>
55

66
<section class="cover">

config/routes.rb

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,11 @@
6464
get "/kata" => "docs#kata"
6565
#get "/debug/kata" => "docs#kata"
6666

67-
resources :dojos, only: %i(index show) # GET /dojos.json returns dojo data as JSON
67+
resources :dojos, only: %i(index show) do # GET /dojos.json returns dojo data as JSON
68+
collection do
69+
get :activity # GET /dojos/activity - 道場活動状況(旧 /events/latest)
70+
end
71+
end
6872
resources :docs, only: %i(index show)
6973
resources :podcasts, only: %i(index show)
7074
resources :spaces, only: %i(index)
@@ -84,9 +88,11 @@
8488
#resources :stats, only: %i(show)
8589
#resources :pokemons, only: %i(index create)
8690

87-
# Upcoming Events & Latest Events
91+
# Upcoming Events
8892
get '/events' => 'events#index'
89-
get '/events/latest' => 'events#latest'
93+
94+
# Legacy redirect: /events/latest moved to /dojos/activity
95+
get '/events/latest', to: redirect('/dojos/activity')
9096

9197
# Redirects
9298
get "/releases/2016/12/12/new-backend", to: redirect('/docs/post-backend-update-history')

spec/requests/dojos_spec.rb

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,4 +318,43 @@
318318
end
319319
end
320320
end
321+
322+
describe "GET /dojos/activity" do
323+
before do
324+
# アクティブな道場を作成
325+
@active_dojo = create(:dojo,
326+
name: "Active Dojo",
327+
created_at: 1.week.ago,
328+
inactivated_at: nil
329+
)
330+
331+
# 非アクティブな道場を作成
332+
@inactive_dojo = create(:dojo,
333+
name: "Inactive Dojo",
334+
created_at: 2.years.ago,
335+
inactivated_at: 1.year.ago
336+
)
337+
end
338+
339+
it "returns http success" do
340+
get activity_dojos_path
341+
expect(response).to have_http_status(:success)
342+
end
343+
344+
it "displays the activity status page" do
345+
get activity_dojos_path
346+
expect(response.body).to include("道場別の直近の開催日まとめ")
347+
end
348+
349+
it "includes only active dojos" do
350+
get activity_dojos_path
351+
expect(response.body).to include(@active_dojo.name)
352+
expect(response.body).not_to include(@inactive_dojo.name)
353+
end
354+
355+
it "redirects from old URL /events/latest" do
356+
get "/events/latest"
357+
expect(response).to redirect_to(activity_dojos_path)
358+
end
359+
end
321360
end

0 commit comments

Comments
 (0)