【问题标题】:Rails 3: caches_action and root :to problemRails 3: caches_action 和 root :to 问题
【发布时间】:2011-07-11 15:57:11
【问题描述】:

所以我在我的公共控制器中使用caches_action :page。在我的 routes.rb 中,我指向 root :to => "public#page" 。页面操作包含这一行:@pictures = Picture.paginate :page => params[:id] || 1,因此通常根路径始终显示页面操作以及图片的第一部分。我的问题是,在我开始使用缓存后,root有时会显示页面动作,但不是id=1,而是另一个id(我猜它只是另一个缓存的'page'),所以root上显示的图片是不是最新的。

我如何设置它,以便根目录始终指向缓存的:controller => public, :action => page, :id => 1

【问题讨论】:

标签: ruby-on-rails ruby-on-rails-3 routing memcached


【解决方案1】:

动作缓存不适用于参数(它会忽略它们)。您可以尝试使用 JavaScript 从 URL 中提取 id 并通过 AJAX 加载图片。

如果您真的想通过参数缓存页面,那么您需要添加自定义逻辑来读取/写入缓存文件。

编辑:缓存不考虑 查询字符串 参数

更新:

我认为您想要做的描述如下: Rails action caching with querystring parameters

【讨论】:

  • 为什么缓存似乎对我的其他操作正常工作,即 /show/1 总是显示第一张图片,而 show/2 第二张图片和路线永远不会“混合”?
  • 缓存基于 URL,但忽略查询字符串(我编辑了答案以反映这一点)。由于 show 操作的 :id 参数是 URL 路径的一部分,因此您对 show 的不同请求将分别缓存。
  • 查看更新的答案以获取使用查询字符串参数进行缓存的链接
  • 感谢向导。我已经把它放在我的代码中,正在等待看看是否一切正常:)
【解决方案2】:

我遇到了同样的问题。我找到了两种解决问题的好方法。选项 1 会将所有自定义请求的副本存储在您的缓存中。如果您的网站有很多不会重复的搜索,或者您担心内存空间,那么这并不理想。选项 2 只缓存不带参数的页面。

1) 作为"Wizard of Ogz" 链接,可以使用:cache_path 将参数包含在缓存键中,以便将有参数的页面与无参数请求分开缓存。

caches_action :page,
  :cache_path => proc {|c|
    {:tag => c.params}
  }

2) 如果参数存在,您可以使用 :if 传递 proc 并且根本不缓存操作。这将使自定义搜索远离您的缓存。

caches_action :page,
 :if => proc {
    params.blank?
  }

如果是root以外的url,可以删除controller和action参数:

caches_action :page,
 :if => proc {
    updated_params = params.delete_if { |k,v| ['controller', 'action'].include?(k) }
    updated_params.blank?
  }

这里是对应的 API 信息:http://api.rubyonrails.org/classes/ActionController/Caching/Actions.html

【讨论】:

    【解决方案3】:

    根据 ogz 向导的回答 - 您可能希望在此处采用不同的方法,而不是使用动作缓存,而是在您的图片类中设置一个返回最新图片的方法,缓存该结果方法,然后在加载新图片时更新缓存。然后你可以做类似的事情

    @pictures = params[:id] ? {(Picture.paginate :page => params[:id]) : (Rails.cache.fetch('Picture.new_ones'){Picture.paginate :page => 1})
    

    【讨论】:

    • 我理解逻辑,但不幸的是它对我不起作用......我真的不知道为什么,但是一旦我遇到 /page/2 作为根使用此代码:)
    猜你喜欢
    • 2021-12-22
    • 1970-01-01
    • 2011-09-24
    • 2011-07-26
    • 2011-06-22
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多