2013-10-12 152 views
0

由于我几乎是初学者,所以我想知道如何最好地循环访问数组并修改一些值。该数组将呈现给jQuery将接收数据并显示它的视图。我想在控制器上做很多事情(或者我可能会在以后切换到模型)。在Ruby/Rails中循环遍历数组

该数组被称为@invoices,但在数组中是我想格式化的时间戳。

格式化代码:

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

有人能告诉我如何遍历并覆盖时间戳值

回答

2

的红宝石循环中的一个可能的语法将be.-

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

谢谢 - 我实际上曾经有过这样的一点 - 它做的你的东西有点错了! – tommyd456

+0

它是'@invoices.date = Time.at(invoice.date).strftime(“%d /%m /%Y”)' – tommyd456

+0

@ tommyd456不是'@ invoice',只是'invoice'。该块的变量由'| invoice |'定义,没有任何内容为您设置“@ invoice”。 – meagar

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,然后我将遍历结果 - 我只是认为最好在发送之前将日期排序为所需的格式。 – tommyd456

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 – tommyd456

+0

目前还不清楚你如何发送你的数据。即使通过'render:json => @ invoices'直接发送数据,最好使用全局定义的日期格式:比使用我的第二种方法''invoices.map {| invoice | invoice.date.to_s(:my_format)}'如果你给它一个更好的名称'my_format',它可以在应用程序的任何地方重用,并且你不需要记住这个模式'“%d /%m /%Y”' 。稍后更改为其他模式会更容易。 – spickermann

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's to_json and remove old :date 
    def as_json(options) 
    super(method: :formatted_date, except: :date) 
    end 
end 

然后在控制器你需要做什么。

+0

是的,我提到我可能会将逻辑转移到我的问题模型中,所以这很好 - 谢谢 – tommyd456

+0

但是哪个位置在哪里?我不太清楚您的示例代码中的第二条评论 – tommyd456

+0

我应该提及我使用的数据来自已经格式化为json – tommyd456