1

我有一个项目列表,在它上面我有一些链接可以让您过滤列表,但是在您单击这些链接一次后,WebBrick 返回 304 Not Modified。列表中的项目可以在列表中更改,因此这些过滤器链接显示过时的信息。我的观点是这样的:

应用程序/视图/项目/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' %>");

更新

我能想出的唯一解决方案是将 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>

应用程序/资产/javascripts/items.js.coffee:

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

1 回答 1

0

我正在使用kaminari gem进行分页,他们有一个 remote=true 选项。然后发生的是它生成一个远程链接,并将随机数附加到 url,这样 WebBrick 就不会返回缓存页面。该 url 看起来像:http://youdomain.com/your/path?_=1518477167725 我假设最后的这个数字是一个 time_stamp。由于 url 永远不会匹配缓存中的 url,它将强制它重新加载。

您可以在您的 link_to 中执行类似的操作,因此您仍然可以使用remote=true并且不需要自定义 ajax。

于 2018-02-12T23:19:10.170 回答