12

アクションキャッシングを有効にしているときに、JSONでjsonリクエストに応答する際に問題が発生します。

JSONとHTMLの両方に応答する非常に単純なコントローラーがあり、キャッシュはHTML応答で正常に機能しますが、JSONを要求すると、通常はJSONで応答しますが、アクションキャッシュを有効にすると、JSON出力がレイアウトにラップされます。 !!

キャッシュをクリアすると、デフォルトのレイアウトが存在しないというエラーが表示されます。

ClipsController#indexのArgumentError

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

キャッシュされたアクションのJSONを返すにはどうすればよいですか?

更新、レイアウトに関するエラーは、アクションをキャッシュする方法に関係していると思われます。

caches_action :index, :layout => false

ただし、キャッシュがなくても問題がないため、JSON応答の場合にレイアウトが必要になる理由はわかりません。

一時的に、JSONリクエストをキャッシュしないようにキャッシュフィルターを変更しましたが、これは理想的な回避策ではありません。JSONをキャッシュしたい場合はどうすればよいですか?

caches_action :index, :layout => false, :if => Proc.new { |c| !c.request.format.json? }

4

2 に答える 2

1

これは実際にはアクション キャッシングのバグのようですが、おそらく私が理解していないことがあります。

この行を参照して、どこが間違っているかを確認してください。基本的に、レイアウト オプションを false に設定した場合は気にせず、とにかくレイアウトでレンダリングしようとします。

于 2012-12-29T10:21:47.367 に答える
0

同様の問題が発生しました(ajaxリクエストを介したHTMLのレンダリング、レイアウトはfalseに設定されていますが存在します)

回避策は次のとおりです。空のレイアウトを作成し、それを使用してajaxリクエストを処理します

# app/views/layout/empty.html.erb
<%= yield %>

# controller
class FooController ...
  layout Proc.new { |controller| controller.request.xhr? ? "empty" : "your normal html layout" }
  caches_action ...
end
于 2013-05-24T10:48:24.297 に答える