4

通过Rails Best Practices运行我完成的 Rails 教程应用程序给我一个警告,不要使用该time_ago_in_words方法,因为“在服务器端计算时间太贵了”,因此他们提供了一些示例代码来更改您的实现以使用timeago jQuery 插件. 听起来它会做出有趣的改变,所以我尝试了一下。我使用的原始代码time_ago_in_words在两个地方:

app/views/shared/_feed_item.html.haml

# ...
%span.timestamp
  = t('.time_posted_ago', time: time_ago_in_words(feed_item.created_at) )

app/views/microposts/_micropost.html.haml

# ...
%span.timestamp
  = t('.time_posted_ago', time: time_ago_in_words(micropost.created_at))

我使用 HTML5 标记将代码更改为使用 timeago,如下所示time

app/views/shared/_feed_item.html.haml

# ...
%time.timeago{ datetime: feed_item.created_at.getutc.iso8601 }
  = t('.time_posted_ago', time: feed_item.created_at.to_s)

app/views/microposts/_micropost.html.haml

# ...
%time.timeago{ datetime: micropost.created_at.getutc.iso8601 }
  = t('.time_posted_ago', time: micropost.created_at.to_s)

我想,我只需要将 timeago() 方法添加到我的咖啡脚本文件中:

应用程序/资产/javascripts/application.js.coffee

$(document).ready ->
  $("time.timeago").timeago()

这不起作用,所以我尝试将声明移至microposts.js.coffeeusers.js.coffee,无论有无,但$(document).ready ->仍然不行。然后我想也许 timeago 所需的库默认情况下不包含在 中jquery-rails,所以我添加了它们:

应用程序/资产/javascripts/application.js.coffee

//= require jquery
//= require jquery_ujs
//= require jquery.min
//= require jquery.timeago
//= require bootstrap
//= require_tree .

在此处添加jquery.min.jsandjquery.timeago.js声明不起作用,而且我还假设我的语法已关闭,因为它们破坏了我依赖于 javascript 的其他页面元素。

所以,据我了解,我认为我的 haml 文件中的实现代码是正确的,但我只是不知道:

  1. 我应该在哪个咖啡脚本文件中$("time.timeago").timeago()调用以及如果我所拥有的不正确我应该如何编写它
  2. timeagorails-jquery 中是否包含库
  3. 如果不是,如何正确包含它们

在花了很多时间在这之后,我最终尝试了rails-timeago gem,它除了有一些不错的助手外,确实可以让时间正确显示。但是,它似乎不能很好地与t()上面的 rails 方法实现配合使用,以便仅以文字形式获取时间,然后将其插入到 i18n 字符串中。

那么,如何time_ago_in_words在带有 i18n 的 Rails 3.2 应用程序中使用 timeago JQuery 插件获得预期的效果?

4

1 回答 1

5

我设法使用rails-timeago gem破解了一个解决方案。这不是最优的,但它似乎得到了想要的 timeago 效果,这非常好。我想知道如何仅使用timeago jQuery 插件%time.timeago标签在 Rails 中获得相同的效果。无论如何,希望这对某人感兴趣。

设置

宝石文件

gem 'rails-timeago', '1.3.0'

配置/初始化程序/timeago.rb

Rails::Timeago.default_options limit: proc { 20.days.ago }, nojs: true
Rails::Timeago.locales = [:en, :it, :ja]

创建app/assets/javascripts/locales目录以将自定义设置到 timeago i18n 字符串。为了完整起见,我从jQuery-timeago Github 存储库中为我的应用程序获取了我想要的三个语言环境并将它们放在目录下,但实际上只是最终更改了 ja 语言环境文件。

应用程序/资产/javascripts/application.js.coffee

# ...
//= require jquery
//= require jquery_ujs
//= require rails-timeago

应用程序/视图/布局/application.html.haml

# ...
%head
  # ...
  = javascript_include_tag "application"
  = timeago_script_tag

执行

app/views/microposts/_micropost.html.haml

# ...
%span.timestamp
  = t('.time_posted_prefix')
  %time<
    = timeago_tag(micropost.created_at)
    = t('.time_posted_suffix')

app/views/shared/_feed_item.html.haml的代码是相同的:只需micropost替换feed_item.

i18n

配置/语言环境/en.yml

microposts:
  micropost:
    time_posted_prefix: Posted
    time_posted_suffix: ""

配置/语言环境/it.yml

microposts:
  micropost:
    time_posted_prefix: Pubblicato
    time_posted_suffix: ""

配置/语言环境/ja.yml

microposts:
  micropost:
    time_posted_prefix: ""
    time_posted_suffix: に投稿された。

shared.feed_itemi18n 文件中的字符串是相同的。

我找不到t()动态使用timeago_tag(例如t('.time_posted_ago', time: timeago_tag(micropost.created_at)))结果的方法,所以我将结果放在前缀和后缀之间。timeago 提供了与时间相关的前缀/后缀,但不提供与“发布”相关的前缀/后缀,因此在上面添加了它们。
为了消除 and 的输出之间的空格timeago_tagtime_posted_suffix特别是对于日语),我将这两个标签包装在一个%time<带有 a 的标签中,<删除标签中的所有空格。这是一件小事,但对我来说很烦人,所以我想把它放进去,但如果你不使用需要键值的语言,这绝不是必要的time_posted_suffix。我还假设有更好的方法来做到这一点。

问题

我最初在app/assets/javascripts/locales目录下有jquery.timeago.en.jsjquery.timeago.it.jsjquery.timeago.ja.js,但是我遇到了 en 文件没有的问题为 en 语言环境加载;相反,目录中按字母顺序排列的最后一个文件 ja 将与 en 语言环境一起使用。因此,我将 en 文件重命名为jquery.timeago.xx.js,它可以显示英文。我尝试将 en 文件移到 locales 目录之外,但它似乎从未被拾取,所以它变成了 xx。

更新

我遇到的 i18n 问题现在已经解决了。有关详细信息,请参阅此 Github 问题。总之,我摆脱了我的app/assets/javascripts/locales目录,只将jquery.timeago.ja.js(我真正想要自定义的唯一文件)放在lib/assets/javascripts/locales目录下,这意味着:it:enlocales,timeago的默认翻译被使用,并且:en翻译按预期显示。rails-timeago所以,我确实得到了我认为用gem解决这个问题的好方法。

更新 2

此解决方案目前在本地工作,但由于资产预编译问题无法正确部署到 Heroku...

更新 3

找到了一个似乎可以在本地和 Heroku 中使用的配置解决方案:

配置/初始化程序/timeago.rb

Rails::Timeago.default_options limit: proc { 20.days.ago }, nojs: true
Rails::Timeago.locales = [:en, :it, :ja]
Rails::Timeago.map_locale "en", "jquery.timeago.js"  # default
Rails::Timeago.map_locale "it", "locales/jquery.timeago.it.js"  # default
Rails::Timeago.map_locale "ja", "timeago/jquery.timeago.ja.js"  # customized

配置/环境/production.rb

# ...
config.assets.precompile += %w( jquery.timeago.js locales/jquery.timeago.it.js timeago/jquery.timeago.ja.js )

而且,在这种情况下,唯一需要的自定义文件是app/assets/javascripts/timeago/jquery.timeago.ja.js

更多细节可以在相关的 Github issue中找到。

于 2012-06-21T20:10:58.223 回答