Rails更短“time_ago_in_words”

时间:2012-09-25 23:20:53

标签: ruby-on-rails time

除了“time_ago_in_words”之外,轨道中是否有不同的时间计算?我希望能够在几个小时的时间内使用'h'几个月......前。 3d,或4h,或5m

我的代码现在......

     <%= time_ago_in_words(feed_item.created_at) %> ago.

3 个答案:

答案 0 :(得分:12)

构成此字符串的组件可以进行本地化,并且是datetime.distance_in_words命名空间

例如棒

en:
  datetime:
    distance_in_words:
      x_minutes:
        one: "1m"
        other: "%{count}m"

铁路将说10米而不是10分钟。根据需要重复几小时,几天等。您可以在action_view中查看所有键的locales/en.yml

如果你只想要短格式,你可以创建一个只使用这些键并使用它的伪语言环境

time_ago_in_words created_at, false, :locale => :en_abbrev

答案 1 :(得分:1)

以下是其他一些方法。您可以像正常一样运行方法,然后在字符串上使用gsub

链接的

string.gsub(/ mi.*/, 'm')
      .gsub(/ h.*/, 'h')
      .gsub(/ d.*/, 'd')
      .gsub(/ mo.*/, 'mo')
      .gsub(/ y.*/, 'y')

哈希

string.gsub(/ .+/, { 
  ' minute'=> 'm', ' minutes'=>'m', 
  ' hour' => 'h', ' hours' => 'h', 
  ' day' => 'd', ' days' => 'd', 
  ' month' => 'mo', ' months' => 'mo', 
  ' year' => 'y', ' years' => 'y' 
})

string.gsub(/ .+/) { |x| x[/mo/] ? 'mo' : x[1] }

除了字符串为"less than a minute"之外,它们都是相同的。链式解决方案返回"less than a minute"。哈希解决方案返回"less"。块解决方案返回"lesst"

只需更改此案例的区域设置文件

en:
  datetime:
    distance_in_words:
      less_than_x_minutes:
        one: '<1m'

或者在方法顶部添加一个return to子句

def my_method(string)
  return '<1m' if string == 'less than a minute'
  # code
end

注意:不包含include_seconds: true选项的解决方案。

答案 2 :(得分:0)

在较新版本的 rails 中,您可以指定一个范围作为方法的选项,如下所示:

time_ago_in_words(company.updated_at, scope: 'datetime.distance_in_words.abbrv')

然后你只需要像这样构造你的常规 i18n 文件:

en:
  datetime:
    distance_in_words:
      abbrv:
        about_x_hours:
          one: ~ 1h
          other: ~ %{count}h
        about_x_months:
          one: ~ 1mo
          other: ~ %{count}mo
        about_x_years:
          one: ~ 1y
          other: ~ %{count}y
        almost_x_years:
...

此信息也可在文档中找到: https://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#method-i-distance_of_time_in_words