由于我几乎是Rails的初学者,我想知道如何最好地循环数组并修改一些值。该数组被渲染到jQuery将接收数据并显示它的视图。我想在Controller中做一些艰苦的工作(或者我可能会在以后切换到模型)。
数组名为@invoices
,但数组中是我要格式化的时间戳。
要格式化的代码是:
Time.at(@invoice.date).strftime("%d/%m/%Y")
有人可以告诉我如何循环并覆盖时间戳值
答案 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)