質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

1694閲覧

コードをもう少しシンプル(綺麗)に書けないか

innjera

総合スコア132

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

1グッド

1クリップ

投稿2016/11/19 15:24

以下の通り、@@分前に、@@時間前、@@日前といった形になるようにコードを書いています。
これで問題なく表記されるのですが、なんとなく原始的、冗長で、もう少しシンプル(綺麗)にか書けないでしょうか?

ruby

1<% 2 time_n = Time.now 3 time_p = Time.at(user.created_time.to_i) 4 time_s = time_n - time_p 5%> 6 7<% if time_s/60 < 60 %> 8 <%= sprintf("%.0f",time_s/60) %>min ago 9<% elsif time_s/60/60 < 24 %> 10 <%= sprintf("%.0f",time_s/60/60) %>hours ago 11<% elsif time_s/60/60/24 < 2 %> 12 <%= sprintf("%.0f",time_s/60/60/24) %>day ago 13<% elsif %> 14 <%= sprintf("%.0f",time_s/60/60/24) %>days ago 15<% end %>
maisumakun👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

まず、60は1分間、60*60は1時間などの表記をわかりやすく書く方法がRailsには用意されています。
Numeric - Ruby on Rails API
つまり、1.minutesとか1.hoursとか1.daysとかで表現できますので、それと比較や割ったりすることで、時間や分数が得られます。比較もそのまま、time_s < 1.minutesみたいな書き方が可能です。

次に、if-elseですが、うーん、ちょっと微妙ですが、case-when文にすることもできます。case-when文はwhenは===で比較なのですが、Rangeと比較すると===は範囲に含むか含まないかになるため、そのような処理も可能です。

ERB

1<% case time_s %> 2<% when 0 ... 1.hours %> 3 <%= sprintf("%.0f", time_s / 1.minutes) %>min ago 4<% when 1.hours ... 1.days %> 5 <%= sprintf("%.0f", time_s / 1.hours) %>hours ago 6<% when 1.days ... 2.days %> 7 <%= sprintf("%.0f", time_s / 1.days) %>day ago 8<% else %> 9 <%= sprintf("%.0f", time_s / 1.days) %>days ago 10<% end %>

投稿2016/11/20 01:49

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

innjera

2016/11/20 06:11

なるほどーー、本片手にやっていましたが、知りませんでした。 大変有難う御座います。ご教示頂いた書き方の方がずっと、プログラミングら引くかっこいいですね。 レベルアップできました。
guest

0

そのような処理が書かれたヘルパーが既に存在しています。
http://apidock.com/rails/ActionView/Helpers/DateHelper/time_ago_in_words

もし、どうしてもコードを書きたいなら、このような感じで。

ruby

1def humanize secs 2 [[60, :seconds], [60, :minutes], [24, :hours], [1000, :days]].map{ |count, name| 3 if secs > 0 4 secs, n = secs.divmod(count) 5 "#{n.to_i} #{name}" 6 end 7 }.compact.reverse.join(' ') 8end 9 10p humanize 1234 11#=>"20 minutes 34 seconds" 12p humanize 12345 13#=>"3 hours 25 minutes 45 seconds" 14p humanize 123456 15#=>"1 days 10 hours 17 minutes 36 seconds" 16p humanize(Time.now - Time.local(2010,11,5)) 17#=>"4 days 18 hours 24 minutes 7 seconds"

http://stackoverflow.com/questions/4136248/how-to-generate-a-human-readable-time-range-using-ruby-on-rails

投稿2016/11/21 09:03

matsubokkuri

総合スコア744

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問