所以我在公共控制器中使用caches_action :page
。在我的routes.rb中,我指向root :to => "public#page"
。页面操作包含以下行:@pictures = Picture.paginate :page => params[:id] || 1
,因此通常根路径始终显示带有第一部分图片的页面操作。我的问题是,在我开始使用缓存后,root有时会显示页面操作,但不会显示id = 1,但是有另一个id(我猜它只是另一个缓存的'page'),所以root上显示的图片是不是最新的。
如何设置它以便root始终指向缓存的:controller => public, :action => page, :id => 1
?
答案 0 :(得分:2)
动作缓存不适用于params(忽略它们)。您可以尝试使用JavaScript从URL中提取id并通过AJAX加载图片。
如果你真的想通过参数缓存页面,那么你需要添加自定义逻辑来读/写缓存文件。
编辑:缓存不考虑查询字符串参数
更新:
我认为你想要做的事情在这里描述: Rails action caching with querystring parameters
答案 1 :(得分:1)
我有同样的问题。我找到了两种解决问题的好方法。选项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?
}
如果它是您的根以外的网址,您可以删除控制器和操作参数:
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
答案 2 :(得分:0)
继续从ogz向导的回答 - 你可能想在这里采取不同的方法,而不是使用动作缓存,在你的图片类中设置一个方法,返回最新的图片,缓存结果方法,然后在加载新图片时更新缓存。然后你可以做类似
的事情@pictures = params[:id] ? {(Picture.paginate :page => params[:id]) : (Rails.cache.fetch('Picture.new_ones'){Picture.paginate :page => 1})