2013-10-12 146 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