2013-05-28 123 views
1

我有一個項目列表及其上方我有幾個鏈接,允許您過濾列表,但是當您單擊這些鏈接一次後,WebBrick返回304 Not Modified。列表中的項目可以在列表中更改,因此這些篩選器鏈接顯示過時的信息。我的看法是這樣的:Rails遠程緩存link_to

應用程序/視圖/項目/ index.html.erb:

<%= link_to 'All', {action:'filter', filter:'all'}, remote:true %> 
<%= link_to 'To Buy', {action:'filter', filter:'to_buy'}, remote:true %> 
<div id="items"> 
    <%= render 'items' %> 
</div> 

WebBrick在開發模式下運行,以便緩存不應該被打開。我可以將該方法設置爲除GET之外的其他方法,但從技術上講這是不正確的。有沒有任何選項可以確保link_to不返回緩存的內容?我使用的是Rails 3.2.13。

應用程序/控制器/ items_controller.rb:

def filter   
    case params[:filter] 
    when 'to_buy' then 
     @items=Item.where('to_buy=?', true) 
    when 'all' then 
     @items=Item.all 
    end 
end 

應用程序/視圖/項目/ filter.js.erb:

$('#items').html("<%=j render 'items' %>"); 

UPDATE

我可以在唯一的解決辦法拿出來是把link_tos變成普通的HTML鏈接,並讓JQuery做緩存設置爲false的ajax請求:

應用程序/視圖/項目/ index.html.erb:

<a href="javascript:;" class="filter_link" data-filter="all">All</a> 
<a href="javascript:;" class="filter_link" data-filter="to_buy">To Buy</a> 

應用程序/資產/ Java腳本/ items.js.coffee:

$('.filter_link').click -> 
    filter=$(this).data('filter') 
    $.ajax "items/filter/#{filter}", cache:false 
+0

它是否真的觸及控制器操作?鏈接沒有控制器名稱 – 2013-05-28 10:09:41

+0

它每次都擊中控制器(WebBrick輸出正在執行的SQL),但是會向瀏覽器返回304響應。控制器屬性不是必需的。 –

回答

0

我使用kaminari gem進行分頁,和他們有一個remote = true的選項。然後會發生什麼,它會生成一個link_to遠程,並且還會向該url附加一個隨機數,以便WebBrick不會返回緩存頁面。 該網址看起來像這樣:http://youdomain.com/your/path?_=1518477167725 我假設這個數字在最後是一個time_stamp。由於url永遠不會匹配緩存中的url,因此會強制它重新加載。

你可以在你的link_to中做這樣的事情,所以你仍然可以使用remote=true而不需要自定義ajax。