Поскольку я в значительной степени новичок в Rails, я хотел бы знать, как лучше всего перебирать массив и изменять некоторые значения. Массив отображает представление, в котором jQuery будет получать данные и отображать их. Я хочу сделать тяжелую работу в контроллере (или я могу переключиться на модель позже).
Массив называется @invoices
но в массиве есть метка времени, которую я хочу отформатировать.
Код для форматирования:
Time.at(@invoice.date).strftime("%d/%m/%Y")
Может ли кто-нибудь показать мне, как выполнить цикл и перезаписать значение метки времени?
Один возможный синтаксис для цикла ruby был бы.
@invoices.each do |invoice|
invoice.date = Time.at(invoice.date).strftime("%d/%m/%Y")
end
На самом деле вы представляете, как представить данные. Это не логика принадлежит контроллеру.
Лучше всего это сделать в модели. Предположим, вы используете JSON для рендеринга данных в jQuery, вам просто нужно добавить существующий метод и переопределить as_json
class Invoice < ActiveRecord::Base
# Add a method to present the original date
def formatted_date
Time.at(self.date).strftime("%d/%m/%Y")
end
# Include above method in Controller to_json and remove old :date
def as_json(options)
super(method: :formatted_date, except: :date)
end
end
Затем в контроллере вам не нужно ничего делать.
Я был неясно, отправляете ли вы только даты в JQuery. Если это так, вы можете сделать это в своем контроллере:
respond_to do |format|
format.html { render :json => @invoices.collect {|invoice| invoice.date.strftime("%d/%m/%Y")} }
end
Обратите внимание на отсутствие @
перед invoice
в блоке, поскольку invoice
является псевдонимом для отдельного элемента в обрабатываемом массиве.
Если вам нужен весь счет-фактура, он немного сложнее, и есть куча уловки Ruby, которая может свести к минимуму количество строк.
Вы не должны изменять свои данные, если хотите только отобразить их в определенном формате.
Rails позволяет вам изменить формат представления Date
в представлениях (для каждого региона):
# config/locales/en.yml
en:
time:
formats:
my_format: "%d/%m/%Y"
# in the view
<%= l invoice.date, format: :my_format %>
(см.: http://guides.rubyonrails.org/i18n.html#adding-date-time-formats)
Или (если вам не нужна поддержка языка), вы добавляете свой собственный формат к методу to_formatted_s
:
# in config/initializers/date_formats.rb
Date::DATE_FORMATS[:my_format] = "%d/%m/%Y"
Time::DATE_FORMATS[:my_format] = "%d/%m/%Y"
# in the view
<%= invoice.date.to_s(:my_format) %>
(см.: http://api.rubyonrails.org/classes/Time.html#method-i-to_formatted_s)
render :json => @invoices
Было бы лучше использовать формат даты, который определен глобально: чем использовать мой второй подход с @invoices.map { |invoice| invoice.date.to_s(:my_format) }
Если вы дадите ему более my_format
имя, чем my_format
его можно многократно использовать в любом месте приложения, и вам не нужно запоминать этот шаблон "%d/%m/%Y"
. И это легче изменить на другой шаблон позже.
@invoices.date = Time.at(invoice.date).strftime("%d/%m/%Y")