2012-11-08 49 views
4

如何從另一個控制器過期緩存中帶有文件擴展名(.json)的片段?rails3緩存:過期片段與擴展名

我正在使用Rails 3.2.8。

我有兩個控制器爲相同的模型:/管理/ 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) 

現在,我需要在本書更新或銷燬時終止片段。我有這樣的:

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

+0

用':format =>'json''執行'expire_action'會產生'Expire fragment views/localhost:3000/api/books/4'?這是問題嗎?我很難清楚地瞭解問題所在。 –

+0

是的,我期望它產生views/localhost:3000/api/books/4.json –

+0

我在我的應用程序中嘗試過...並且它按照預期的那樣工作:Expire fragment views/www.example.com/api/books/show/1.json ... ...你可以嘗試在一些非常基本的動作上用'format'參數做一個'expire_action',像你的主頁? –

回答

0

看來,問題出在路由設置默認參數。在API控制器中,params [:format]是'json',而在管理員控制器中它是零。在兩個控制器匹配

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 

這導致PARAMS [:格式]在我的API命名空間中進行設置。我的管理員名稱空間中沒有任何內容,顯然actionpack/ActionCachePath看到這兩個不同。刪除路由中的默認值可解決問題。