【问题标题】:Rails caching remote link_toRails 缓存远程链接到
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    相关资源
    最近更新 更多