如何使用另一个控制器的文件扩展名(.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)
我的带有JSON请求的API控制器读取和写入此片段:
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)
答案 0 :(得分:0)
问题出在路由设置默认参数上。在API控制器中,params [:format]是'json',在Admin控制器中它是零。
当我将此添加到管理员控制器时:
params[:format] = 'json'
expire_action(:controller => 'api/books', :action => 'show', :id => @book.id, :format => 'json')
然后,两个控制器中的片段匹配。
这让我回到我的路线:
在我的路线中,我有这个:
namespace :api, :defaults => {:format => 'json'} do
resources :books, :only => [:show]
end
这导致在我的api命名空间中设置了params [:format]。我的管理命名空间中没有任何内容,显然actionpack / ActionCachePath以不同的方式看到了这两个。删除路由中的默认值可解决问题。