4

別のコントローラーからのファイル拡張子 (.json) を持つキャッシュ内のフラグメントを期限切れにするにはどうすればよいですか?

Rails 3.2.8 を使用しています。

/admin/books_controller と /api/books_controller という同じモデル用の 2 つのコントローラーがあります。管理者コントローラーはブックの作成/更新/削除に使用され、昇格されたアクセスが必要です。api/books_controller は、ユーザーが書籍に関する詳細を検索/一覧表示するために使用されます。api/books_controller をキャッシュしようとしました

class Api::BooksController < ApiController
  caches_action :show

  def show    
    @book = Book.find(params[:id])
  end
end

これはうまくいきます。最初のリクエストは遅く、2 番目のリクエストは速い

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 )

4

1 に答える 1

0

問題はルーティング設定のデフォルトパラメータにあるようです。APIコントローラーでは、params [:format]は'json'であり、Adminコントローラーではnilでした。

これを管理コントローラーに追加したとき:

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 [:format]がAPI名前空間に設定されました。admin名前空間には何もありませんでしたが、actionpack/ActionCachePathはこれら2つを異なって見たようです。ルートのデフォルトを削除すると、問題が修正されました。

于 2012-11-08T19:21:19.057 に答える