Rails 3:caches_action和root:to problem

时间:2011-07-11 15:57:12

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

所以我在公共控制器中使用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

3 个答案:

答案 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})