gpt4 book ai didi

ruby-on-rails-3 - rails3 缓存 : expire fragment with extension

转载 作者:行者123 更新时间:2023-12-04 07:15:41 24 4
gpt4 key购买 nike

如何使缓存中带有来自另一个 Controller 的文件扩展名 (.json) 的片段过期?

我正在使用 Rails 3.2.8。

我有两个用于相同模型的 Controller :/admin/books_controller 和/api/books_controller。管理 Controller 用于创建/更新/删除书籍,需要提升访问权限。 api/books_controller 用于搜索/列出用户有关书籍的 View 详细信息。我试图缓存 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 请求,发送到不同的 Controller ):
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 Controller 读取和写入此片段:
views/localhost:3000/api/books/4.json

我的管理员 Controller 尝试使此片段过期:
views/localhost:3000/api/books/4

如何使用不同的请求格式使来自另一个 Controller 的 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 )

最佳答案

问题似乎出在路由设置默认参数上。在 API Controller 中,params[:format] 是 'json' 而在 Admin Controller 中它是 nil。

当我将它添加到我的管理 Controller 时:

params[:format] = 'json'
expire_action(:controller => 'api/books', :action => 'show', :id => @book.id, :format => 'json')

然后,两个 Controller 中的片段匹配。

这让我回到我的路线:

在我的 route ,我有这个:
namespace :api, :defaults => {:format => 'json'} do
resources :books, :only => [:show]
end

这导致 params[:format] 在我的 api 命名空间中设置。我的 admin 命名空间中没有任何内容,显然 actionpack/ActionCachePath 对这两者的看法不同。删除路由中的默认值解决了这个问题。

关于ruby-on-rails-3 - rails3 缓存 : expire fragment with extension,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13295489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com