3

目立たない ajax をサイトに追加しているので、リクエスト タイプに応じてレイアウトを設定する必要があります。

# app/controllers/application_controller.rb
layout Proc.new { |controller| controller.request.xhr? ? 'ajax' : 'application' }

# app/views/layout/ajax.html.erb
<%= render :partial => "shared/flash", :object => flash %>
<%= yield %>

しかし、ネストされたレイアウトも使用し、JavaScript で取得した ajax コンテンツを挿入する場所を処理したいと考えています。rails api layout nil force default layout behavior with inheritanceによると、私はこれを試しました:

layout Proc.new { |controller| controller.request.xhr? ? 'ajax' : nil }

これは機能しません。レイアウトがまったく得られません。私が見つけた唯一の情報は、Rails がレイアウトを処理する方法が原因で、実際にはこれが機能しないという古いチャット ログです。

これを達成する方法はありますか?

nil を返す proc は機能しないため、満たされている条件でレイアウトを設定する方法はありますか (request.xhr? ここでは)。layout_if のようなもの。

それとも私はちょうど追加する必要があります

layout Proc.new { |controller| controller.request.xhr? ? 'ajax' : 'controller_name' }

レイアウトが異なるすべてのコントローラーに?

私の ajax リクエストは実際に html を返します。少しごまかして、それらの html 要素を .xml ファイルで返し、respond_to を使用してレイアウトを設定する必要がありますか? (別の理由から、これは素晴らしいことかもしれません。レイアウト コンテンツの有無にかかわらずアクセスする URL が異なると、ページ キャッシュが可能になりますが、これを実現する方法は他にもあります。)

または、もっと良い解決策があるかもしれません。

4

1 に答える 1

1

Rails はこれを自動的に行うことができます。たとえば、2 つのレイアウト (application.html.erbapplication.js.erb) を作成します。リクエストが xhr の場合 標準のリクエストがサーバーに来ると、 js( application.js.erb) レイアウトが使用され、レールがレンダリングされますapplication.html.erb

于 2013-02-08T10:41:42.183 に答える