2012-10-20 69 views
3

我在HAML文檔上有一些複選框,當點擊'刷新'按鈕時它應該改變顯示的結果。這工作正常,但是當頁面重新加載被選中的框時,所有這些都不再被選中。在HAML中保留複選框

如何重新配置​​HAML以在頁面瀏覽中保持複選框選中狀態?

= form_tag movies_path, :method => :get do 
    Include: 
    - @all_ratings.each do |rating| 
    = rating 
    = check_box_tag "ratings[#{rating}]", '1', true 
    = submit_tag 'Refresh' 

我還指定的複選框都應該被默認選中,但是當我加載網頁,他們將不檢查...

+1

我認爲這可能是相當複雜的實現?(默認狀態)。 。您必須以某種方式在請求之間保存複選框的狀態。一種方法是在每次選中複選框時使用AJAX發送請求。然後服務器可以將信息存儲在會話中。 另一種方式是將複選框信息存儲在本地存儲中,但這隻適用於現代瀏覽器。 – Jesper

+0

+1 @Jesper我認爲這是您建議的一個很好的解決方案,不要太複雜。 skeniver checkout [jquery.ajax()](http://api.jquery.com/jQuery.ajax/)發送一個請求到一個控制器動作,點擊複選框並將該複選框的id(或任何)存儲到在會話中選擇並將它們傳遞到您的視圖中。 – cih

+0

您可以將複選框邏輯保留在視圖之外,而且應該讓事情更輕鬆。例如,通過將新的類屬性設置爲params [:rating],然後將結果散列值從1更改爲true,則不需要其他解決方案中描述的複雜邏輯。 – Horus

回答

0

我想複選框並不代表某些持久狀態的業務數據(否則這將不適用),但它們實際上是一種「過濾器」或類似的臨時配置視圖。

在這種情況下,您應該只通過AJAX請求結果,而不是複選框。所以你不必將它們存儲在任何地方,因爲它們不會消失。

5

這將完成你想要的:來電後

= form_tag movies_path, :method => :get do 
     Include: 
     - @all_ratings.each do |rating| 
     = rating 
     = check_box_tag "ratings[#{rating}]", rating, if params[:ratings]; params[:ratings].include?(rating) end 
    = submit_tag 'Refresh' 

params[:ratings]情況仍然存在,所以你可以用它來標記的箱子,其中由用戶之前點擊。

2

超新星32非常接近。

缺少的唯一東西是基於最後一行「......指定複選框應該默認選中」。

您的代碼應該是這樣的:

= check_box_tag 「評級[#{RATING}]」,1,如果PARAMS [:等級] PARAMS [:等級] .INCLUDE(評級)其他真正的最終

就包括時代ELSE語句時,參數不存在