2011-11-02 63 views
0

我有一個Rails視圖,它根據用戶選擇報表的日期範圍生成一個HTML報表,並且所有這一切都很好。如何通過link_to傳遞對象實例(日期爲例)

如果用戶喜歡他們看到的內容,那麼有一個按鈕可以導出與csv相同的報告。

我的問題是如何方便地傳遞用戶先前選擇的日期範圍。我已經閱讀了關於通過link_to傳遞參數的各種stackoverflow問題/答案,這在某種程度上有效,但日期作爲文本字符串發送,而我真正需要的是將日期作爲Date對象傳遞。

這是我當前的link_to,其傳遞的日期PARAMS爲字符串:

<%= link_to image_tag("Buttons/ExportReport.png", :border => 0), 
     export_sales_path(:start => @start_date, 
         :end => @end_date, 
         :sales => @items) %> 

我會很感激,如果有人可以告訴我如何通過的link_to傳遞一個對象的實例。

感謝您的閱讀。

回答

2

您無法在URL中傳遞對象。首先,URL的長度限制在1500字節左右,其次,Ruby對象只與創建它們的過程相關。

這裏要記住的重要一點是,沒有推測將接收您的請求的過程將與使用鏈接生成頁面的過程相同。通過設計,Ruby on Rails從每個傳入請求的乾淨頁面開始,除了可以從三個基本設施提取的內容(cache,session和您的數據庫)之外沒有任何知識。

對於像@items這樣的事情,你需要做的是將這個集合保存在某個地方,比如在一個數據庫中,並在鏈接到這個保存集合的URL中放置一個標記或標識符,或者將其轉換爲適合的表示在URL中。如果列表很小,則始終可以發送@items.collect(&:id).join(','),然後在接收端對其進行解碼。

如果您需要的只是一個臨時存儲,則可以在Rails.cache子系統中使用的Memcache可作爲放置此類事物的好地方。

由於日期很容易表示爲整數,所以您可以隨時提供這些參數。做法可能是這樣的:

<%= link_to image_tag("Buttons/ExportReport.png", :border => 0), 
    export_sales_path(
     :start => @start_date.to_i, 
     :end => @end_date.to_i, 
     :sales => @items.collect(&:id).join(',') 
    ) %> 

您可以切換這一個POST風格的要求,這將讓你如果需要提供一個非常長的產品清單。

+0

啊,謝謝。我沒有真正理解這是使用URL,但顯然現在你指出了它。感謝您的全面回答。 – Snips

0

我認爲這是不可能的......你所能做的就是把日期作爲一個字符串傳遞,然後把這個字符串解析成控制器中的Date對象。

+0

感謝您的回覆。 – Snips

相關問題