0

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

该数组被调用@invoices,但在数组中是一个我想要格式化的时间戳。

格式化的代码是:

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

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

4

4 回答 4

2

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

@invoices.each do |invoice|
    invoice.date = Time.at(invoice.date).strftime("%d/%m/%Y")
end
于 2013-10-12T13:12:26.433 回答
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

然后在控制器中你什么都不用做。

于 2013-10-12T13:57:13.750 回答
0

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

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

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

如果要整张发票,只是稍微复杂一点,还有一堆 Ruby 的小聪明,可以尽量减少行数。

于 2013-10-12T13:45:14.803 回答
0

如果您只想以特定格式显示数据,则不应更改数据。

Rails 允许您更改 aDate在视图中呈现的格式(特定于每个区域设置):

# 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 )

于 2013-10-12T13:51:50.730 回答