【发布时间】:2012-11-08 18:34:42
【问题描述】:
如何使缓存中带有来自另一个控制器的文件扩展名 (.json) 的片段过期?
我使用的是 Rails 3.2.8。
我有两个相同型号的控制器:/admin/books_controller 和 /api/books_controller。管理控制器用于创建/更新/删除书籍并需要提升访问权限。 api/books_controller 用于搜索/列出用户关于一本书的详细信息。我试图缓存 api/books_controller
class Api::BooksController < ApiController
caches_action :show
def show
@book = Book.find(params[:id])
end
end
这很好用。第一个请求很慢,第二个请求很快
Rendered api/books/show.json.rabl (119.7ms)
Write fragment views/localhost:3000/api/books/4.json (1.7ms)
Completed 200 OK in 568ms (Views: 124.2ms | ActiveRecord: 9.5ms)
Read fragment views/localhost:3000/api/books/4.json (0.2ms)
Completed 200 OK in 16ms (ActiveRecord: 2.6ms)
现在,我需要在 Book 更新或销毁时使碎片过期。我有这个:
class Admin::BooksController < AdminController
def update
@book.attributes = params[:book]
if (@book.save)
expire_action(:controller => 'api/books', :action => 'show', :id => @book.id, :format => 'json')
end
end
end
但是,这不会解析到相同的片段(请求现在是 HTML 请求,发送到不同的控制器):
Started PUT "/admin/books/4" for 127.0.0.1 at 2012-11-08 12:27:11 -0600
Processing by Admin::BooksController#update as HTML
...
Expire fragment views/localhost:3000/api/books/4 (0.1ms)
我的 API 控制器通过 JSON 请求读取和写入此片段:
views/localhost:3000/api/books/4.json
我的管理控制器试图使这个片段过期:
views/localhost:3000/api/books/4
如何使用不同的请求格式使来自其他控制器的 views/localhost:3000/api/books/4.json 过期?
这个问题:rails 3 caching: expire action for named route 表示我可以使用正则表达式使多个片段过期,但这需要缓存中的键是可枚举的 (http://api.rubyonrails.org/classes/ActionController/Caching/Fragments.html#method-i-expire_fragment)
【问题讨论】:
-
用
:format => 'json'执行expire_action会产生Expire fragment views/localhost:3000/api/books/4?是问题吗?我很难清楚地理解问题所在。 -
是的,我预计它会产生views/localhost:3000/api/books/4.json
-
我在我的应用程序中尝试了它...它按预期工作
Expire fragment views/www.example.com/api/books/show/1.json...您可以尝试在一些非常基本的操作上使用format参数执行expire_action,例如你的主页? -
也可以尝试使用
expire_fragment来代替相同的参数,看看是否会有所不同 -
看来问题出在我的路线上:namespace :api, :defaults => {:format => 'json'} do resources :books, :only => [:show] end This导致 params[:format] 在我的 api 控制器中设置,但不在我的管理控制器中。
标签: ruby-on-rails-3 caching fragment-caching