Проход по массиву в Ruby / Rails

0

Поскольку я в значительной степени новичок в Rails, я хотел бы знать, как лучше всего перебирать массив и изменять некоторые значения. Массив отображает представление, в котором jQuery будет получать данные и отображать их. Я хочу сделать тяжелую работу в контроллере (или я могу переключиться на модель позже).

Массив называется @invoices но в массиве есть метка времени, которую я хочу отформатировать.

Код для форматирования:

Time.at(@invoice.date).strftime("%d/%m/%Y")

Может ли кто-нибудь показать мне, как выполнить цикл и перезаписать значение метки времени?

Теги:
ruby-on-rails-4

4 ответа

2
Лучший ответ

Один возможный синтаксис для цикла ruby был бы.

@invoices.each do |invoice|
    invoice.date = Time.at(invoice.date).strftime("%d/%m/%Y")
end
  • 0
    спасибо - у меня действительно было это однажды - бит DO YOUR STUFF идет не так!
  • 0
    это будет @invoices.date = Time.at(invoice.date).strftime("%d/%m/%Y")
Показать ещё 5 комментариев
1

На самом деле вы представляете, как представить данные. Это не логика принадлежит контроллеру.

Лучше всего это сделать в модели. Предположим, вы используете 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

Затем в контроллере вам не нужно ничего делать.

  • 0
    Да, я упомянул, что я мог бы перейти от логики к модели в моем вопросе, так что это здорово - спасибо
  • 0
    но какой бит идет куда? Я не совсем уверен в вашем втором комментарии в вашем примере кода
Показать ещё 12 комментариев
0

Я был неясно, отправляете ли вы только даты в JQuery. Если это так, вы можете сделать это в своем контроллере:

respond_to do |format|
   format.html { render :json => @invoices.collect {|invoice| invoice.date.strftime("%d/%m/%Y")} }
end

Обратите внимание на отсутствие @ перед invoice в блоке, поскольку invoice является псевдонимом для отдельного элемента в обрабатываемом массиве.

Если вам нужен весь счет-фактура, он немного сложнее, и есть куча уловки Ruby, которая может свести к минимуму количество строк.

  • 0
    Я отправляю массив счетов-фактур в jQuery, где я буду затем перебирать результаты - я просто подумал, что было бы лучше отсортировать дату в желаемом формате перед отправкой.
0

Вы не должны изменять свои данные, если хотите только отобразить их в определенном формате.

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)

  • 0
    но это JQuery, который рендеринг данных
  • 0
    Не ясно, как вы отправляете свои данные. Даже если вы отправляете свои данные напрямую через render :json => @invoices Было бы лучше использовать формат даты, который определен глобально: чем использовать мой второй подход с @invoices.map { |invoice| invoice.date.to_s(:my_format) } Если вы дадите ему более my_format имя, чем my_format его можно многократно использовать в любом месте приложения, и вам не нужно запоминать этот шаблон "%d/%m/%Y" . И это легче изменить на другой шаблон позже.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню