【发布时间】:2018-02-13 07:19:10
【问题描述】:
我有一个项目列表,在它上面我有一些链接可以让您过滤列表,但是在您单击这些链接一次后,WebBrick 返回 304 Not Modified。列表中的项目可以在列表中更改,因此这些过滤器链接显示过时的信息。我的观点是这样的:
app/views/items/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。
app/controllers/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
app/views/items/filter.js.erb:
$('#items').html("<%=j render 'items' %>");
更新
我能想到的唯一解决方案是将 link_tos 转换为普通的 HTML 链接,并让 JQuery 在缓存设置为 false 的情况下执行 ajax 请求:
app/views/items/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>
app/assets/javascripts/items.js.coffee:
$('.filter_link').click ->
filter=$(this).data('filter')
$.ajax "items/filter/#{filter}", cache:false
【问题讨论】:
-
它真的击中了控制器动作吗?链接没有控制器名称
-
每次都在访问控制器(WebBrick 正在输出它正在执行的 SQL),但向浏览器返回 304 响应。控制器属性不是必需的。
标签: ruby-on-rails