Alex Liang

[Rails] KH Badminton Map計算聚會時間及使用helper整理views

上一篇搞定球聚時間的選單後,我們需要計算下次球聚的日期 (只顯示星期幾而沒有日期,不方便記日子)
藉由Ruby的Time class和rails的helper,可以將計算的過程藏在後面,而不弄亂前端的view

首先,因為球聚的時間是記錄星期幾,在model裡僅是個數字 (0~6表示週日到週六)
下次球聚的日期會根據使用者看到文章的當天計算
例如,預計週三聚會,使用者週四才看到文章。此時需顯示下次聚會日期 (也就是下週三)

Time Class

Ruby的Time class提供wday,可得知日期對應到星期幾,例如

1
2
3
4
2.2.0 :009 > t = Time.now
=> 2016-04-22 15:20:42 +0800
2.2.0 :010 > t.wday
=> 5

View

app/views/posts/show.html.erb
1
2
3
4
...略
<p>
時間:<%= next_meetup_date(@post.day.to_i) %>
</p>

Helper

day_offset是預計週幾聚會,利用Time.now.wday和它之間的關係算出下次聚會日期
next_meetup_date除了顯示日期,還加上星期幾

app/helper/posts_helper.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
module PostsHelper
def calculate_date(day_offset)
meetup_day = day_offset
current_day = Time.now.wday
next_date = DateTime.now + (meetup_day - current_day).days

if meetup_day < current_day
next_date += 7.days # Next week
end
next_date.strftime('%Y/%m/%d')
end

def next_meetup_date(day_offset)
calculate_date(day_offset) + ' (' + I18n.t(:"date.day_names")[day_offset] + ')'
end
end

使用helper的好處是將來如果要改變顯示格式,只要改一個地方就好,其它的view也能使用。

參考來源:
Ruby Time文件
strftime 格式化時間的說明