3

アクションキャッシュを使用しているコントローラーにアクションがあります。ただしlayout: false、レイアウトにはログインステータスなどのユーザー依存の情報があるため、そのキャッシュ呼び出しでフラグを使用しています。これは完全に機能します。

次に、基本的にこのコードをコントローラーに追加する pjax-rails gem を追加しました。

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

これは、一部のリクエストでレイアウトがレンダリングされないことです。今、私は(ちょっと論理的に)これら2つのアプローチを組み合わせたいと思っています。

ただし、pjax_request? == trueこのエラーが発生した場合:

MyController のデフォルト レイアウトはありませんでした

私は何を間違っていますか、どうすればこの問題を解決できますか?


PS: この場合、これは最も簡単に再現できます。

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

  def index
  end
end
4

3 に答える 3

2

これはRailsのバグかもしれないと思います。の 143 行目付近のコード ブロックを確認してくださいactionpack/lib/action_controller/caching/actions.rb

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

最初のブロックでレイアウトなしで本文を正しくレンダリングしているように見えますが、応答本文の一部としてレイアウトを使用しunlessてテンプレートを強制的にレンダリングしています。スタック トレースを見ると、それが例外につながる行です。

ファイルを手動で編集し(これはによって保護されているため、:layout => @cache_layout常に評価されます)、ビューは期待どおりにレンダリングされました。:layout => falseunless

一時的にそのファイルに自分でパッチを当ててバグレポートを開く以外に、これについて何ができるかわかりません。その行の動作についても間違っている可能性がありますが、確かに犯人のようです。

于 2012-03-07T01:11:43.860 に答える
1

Rails 3の時点で、将来これに遭遇する人のために、コントローラーにデフォルトのレイアウトを設定します。

layout "application"

http://apidock.com/rails/AbstractController/Layouts/ClassMethods/layout

この問題を克服しているようです。これは実際にはレールの欠陥です。

于 2013-01-21T18:30:56.203 に答える
0

解決策も提供したかったのですが、これを行うと問題が解決します。

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

action_has_layout@Brandanの回答から強制するだけです

于 2014-02-19T14:56:20.003 に答える