Замена time_ago_in_words плагином timeago jQuery в i18n-ized Rails 3.2 приложении
Запустив законченное приложение Rails Tutorial через Rails Best Practices, я получил предупреждение не использовать time_ago_in_words
метод как "слишком дорого вычислять время на стороне сервера", поэтому они предоставляют пример кода, чтобы изменить вашу реализацию, чтобы использовать плагин timeago jQuery. Звучит так, как будто это будет интересное изменение, поэтому я попытался. Мой оригинальный код, который использовал time_ago_in_words
находится в двух местах:
приложение / просмотров / общий /_feed_item.html.haml
# ...
%span.timestamp
= t('.time_posted_ago', time: time_ago_in_words(feed_item.created_at) )
приложение / просмотров /microposts/_micropost.html.haml
# ...
%span.timestamp
= t('.time_posted_ago', time: time_ago_in_words(micropost.created_at))
Я изменил код, чтобы использовать timeago следующим образом, используя HTML5 time
тег:
приложение / просмотров / общий /_feed_item.html.haml
# ...
%time.timeago{ datetime: feed_item.created_at.getutc.iso8601 }
= t('.time_posted_ago', time: feed_item.created_at.to_s)
приложение / просмотров /microposts/_micropost.html.haml
# ...
%time.timeago{ datetime: micropost.created_at.getutc.iso8601 }
= t('.time_posted_ago', time: micropost.created_at.to_s)
Который, я думал, оставил мне только добавить метод timeago() в мой файл coffeescript:
приложение / активы / JavaScripts / application.js.coffee
$(document).ready ->
$("time.timeago").timeago()
Это не сработало, поэтому я попытался перенести заявление в microposts.js.coffee и users.js.coffee, с и без $(document).ready ->
и до сих пор не идти. Затем я подумал, что, возможно, необходимые для времени библиотеки не включены по умолчанию в jquery-rails
поэтому я добавил их:
приложение / активы / JavaScripts / application.js.coffee
//= require jquery
//= require jquery_ujs
//= require jquery.min
//= require jquery.timeago
//= require bootstrap
//= require_tree .
Добавление jquery.min.js
а также jquery.timeago.js
объявления здесь не сработали, и я также предполагаю, что мой синтаксис отключен, так как они отключили мои другие элементы страницы, основанные на javascript.
Итак, насколько я понимаю, я думаю, что у меня правильный код реализации в моих файлах haml, но я просто не знаю:
- в каком файле coffeescript я должен положить
$("time.timeago").timeago()
позвони и как мне написать это если что у меня неверно - будь то
timeago
библиотеки включены в rails-jquery - если нет, то как их правильно включить
Потратив много времени на это, я в итоге попробовал драгоценный камень rails-timeago, который, наряду с некоторыми хорошими помощниками, помогал правильно отображать время. Тем не менее, это не очень хорошо с рельсами t()
реализация метода выше, чтобы просто получить время в словах и затем интерполировать его в строку i18n.
Итак, как я могу получить желаемый эффект time_ago_in_words
использовать плагин timeago JQuery в приложении Rails 3.2 с i18n?
1 ответ
Мне удалось взломать решение, используя драгоценный камень rails-timeago. Это не оптимально, но, похоже, дает желаемый эффект времени, что довольно приятно. Я хотел бы знать, как получить тот же эффект в Rails, используя только плагин timeago jQuery и %time.timeago
теги. Во всяком случае, надеюсь, это кому-то интересно.
Настроить
Gemfile
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
Реализация
приложение / просмотров /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_item
в файлах i18n одинаковые.
Я не мог найти способ использовать t()
динамически с результатом timeago_tag
(например t('.time_posted_ago', time: timeago_tag(micropost.created_at))
), поэтому я поместил результат между префиксом и суффиксом. timeago предоставляет префиксы / суффиксы, связанные со временем, но не связанные с "публикацией", поэтому они были добавлены выше.
Для того, чтобы избавиться от пространства между выходными timeago_tag
а также time_posted_suffix
(специально для японского), я обернул эти два тега в %time<
пометить с <
удалить все пробелы внутри тега. Это небольшая вещь, но это раздражало меня, поэтому я хотел вставить ее, но это ни в коем случае не является необходимым, если вы не используете языки, для которых нужно значение в time_posted_suffix
ключ. Я также предполагаю, что есть лучший способ сделать это.
вопросы
Первоначально у меня были jquery.timeago.en.js, jquery.timeago.it.js и jquery.timeago.ja.js в каталоге app/assets/javascripts/locales, но у меня была проблема, когда en-файл не загружаться для en locale; вместо этого последний файл в алфавитном порядке в каталоге, который был ja, будет использоваться с локалью en. Итак, я переименовал en-файл в jquery.timeago.xx.js, который отображался на английском языке. Я попытался переместить en-файл за пределы каталога locales, но, похоже, его никогда не поднимали, поэтому он стал хх.
Обновить
Проблемы с i18n, которые у меня были, теперь решены. Посмотрите эту проблему Github для деталей. Таким образом, я избавился от своего каталога app/assets/javascripts/locales и поместил только jquery.timeago.ja.js, единственный файл, который я действительно хотел настроить, в каталог lib/assets/javascripts/locales, что означает, что для :it
а также :en
локали, timeago
Используются переводы по умолчанию, и :en
переводы отображаются как ожидалось. Итак, я получил то, что считаю хорошим решением этой проблемы с rails-timeago
драгоценный камень.
Обновление 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.