2012-03-04 4 views
3

私はアクションキャッシングを使用しているコントローラ上にアクションを持っています。私のレイアウトはログイン状態のようなユーザ依存の情報を持っているので、私はそのキャッシングコールでlayout: falseフラグを使用しています。これは完全に機能します。条件付きレイアウトとレイアウトなしのアクションキャッシング

layout ->(c) { pjax_request? ? false : 'application' } 

レイアウトがレンダリングされていないいくつかの要求にある:

は、その後、私は基本的には、コントローラにこのコードを追加しますpjaxレールの宝石を、追加しました。今私は(ちょっと論理的に)これら2つのアプローチを組み合わせたいと思っています。

しかしときpjax_request? == trueが、私はこのエラーを取得する:

There was no default layout for MyController

私が間違って何をやっているとどのように私はこの問題を解決することができますか?


PS:これは、この場合には、最も簡単な再現性のある:

class MyController < ApplicationController 
    layout false 
    caches_action :index, :layout => false 

    def index 
    end 
end 

答えて

2

私はほとんどこれはRailsのバグかもしれないと思います。ライン143 actionpack/lib/action_controller/caching/actions.rbのまわりのコードブロックをチェックしてください:それは正しく最初unlessブロック内のレイアウトずに体をレンダリングだが、をレンダリングするテンプレートを強制ているよう

body = controller.read_fragment(cache_path.path, @store_options) 

unless body 
    controller.action_has_layout = false unless @cache_layout 
    yield 
    controller.action_has_layout = true 
    body = controller._save_fragment(cache_path.path, @store_options) 
end 

body = controller.render_to_string(:text => body, :layout => true) unless @cache_layout 

controller.response_body = body 

に見えますレスポンスボディの一部としてのレイアウトスタックトレースを見ると、これが例外につながる行です。

私は手動で:layout => @cache_layoutへのファイル(それはunlessによって守られていますので、常に:layout => falseに評価されている)と、期待通りにレンダリングされたビューを編集しました。

あなた自身が一時的にこのファイルを修正し、バグレポートを開く以外に何ができるか分かりません。私はまた、その行の動作について間違っているかもしれませんが、確かに犯人のように見えます。将来的にはこの出くわす誰のための

+0

@からの提案に感謝をaction_has_layoutを強制します。私はちょっとハックして、問題を解決するプルリクエストを書きました:https://github.com/rails/rails/pull/5328。 –

0

私はあなたがこれを行う場合、それはあなたの問題を解決する、また、ソリューションを提供したかった:

layout Proc.new {|controller| 
    controller.action_has_layout = false 
    false 
} 

ただ、うんBrandanの答え

関連する問題