循环遍历Ruby / Rails中的数组

时间:2013-10-12 13:09:44

标签: jquery ruby-on-rails ruby ruby-on-rails-4

由于我几乎是Rails的初学者,我想知道如何最好地循环数组并修改一些值。该数组被渲染到jQuery将接收数据并显示它的视图。我想在Controller中做一些艰苦的工作(或者我可能会在以后切换到模型)。

数组名为@invoices,但数组中是我要格式化的时间戳。

要格式化的代码是:

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

有人可以告诉我如何循环并覆盖时间戳值

4 个答案:

答案 0 :(得分:2)

ruby​​循环的一种可能语法是.-

@invoices.each do |invoice|
    invoice.date = Time.at(invoice.date).strftime("%d/%m/%Y")
end

答案 1 :(得分:1)

实际上您关注的是如何呈现数据。这不是属于控制器的逻辑。

更好的方法是在模型中完成。假设您使用JSON将数据呈现给jQuery,您只需要添加一个present方法并覆盖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's to_json and remove old :date
  def as_json(options)
    super(method: :formatted_date, except: :date)
  end
end

然后在控制器中你无需做任何事情。

答案 2 :(得分:0)

我不清楚你是否只向JQuery发送日期。如果是这样,您可以在控制器中执行此操作:

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

请注意,块中@之前没有invoice,因为invoice是当前正在处理的数组中单个元素的别名。

如果你想要整张发票,它只会稍微复杂一点,并且有一堆Ruby聪明可以减少行数。

答案 3 :(得分: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