Railsがレイアウト内でRJSテンプレートをレンダリングするのはなぜですか?
-
28-10-2019 - |
質問
これを使用するコントローラーのためにこれを行う必要があります active_scaffold
宝石。このようなコントローラーがあります。
class Admin::UsersController < ApplicationController
layout 'admin'
active_scaffold :users do |config|
config.search.columns = [:first_name, :last_name]
end
end
私たちがRails 2.3.10にいたとき、それはうまくいきましたが、Rails 3.0.10にアップグレードしています。アップグレードの一部として、アップグレードする必要がありました active_scaffold
(現在からインストールされています rails-3.0
の枝 git://github.com/activescaffold/active_scaffold
)互換性があります。私たちが抱えていた問題の1つは、テーブルを検索していても機能していなかったことです。ログファイルに表示されます:
Rendered <snip>/gems/active_scaffold-25b3d724f35b/frontends/default/views/list.js.rjs within layouts/admin (923.5ms)
コントローラーで指定されたレイアウトでRJSテンプレートをレンダリングしていることに注意してください。それは私にとって不当なデフォルトのようです。 RJSテンプレートをレンダリングしてはいけません それなし レイアウト デフォルトで?とにかく、私はそれを修正しました:
class Admin::UsersController < ApplicationController
layout :admin_layout
private
def admin_layout
respond_to do |format|
format.js { false }
format.html { 'admin' }
end
end
end
これにより、検索とページネーションの問題が修正されます。 (RJSテンプレートはレイアウトなしでレンダリングされるため、ブラウザは結果のJavaScriptを実行できます)。私の質問は、なぜRALSテンプレートをレイアウトでレンダリングしてはならないとRailsに伝えなければならないのですか?そして、より良い解決策はありますか?これは私にはあまりにもハックのように感じられます(悪い種類のハック---将来的に壊れるハックの種類)。
解決
さて、私はそれを理解しました。 @numbers1311407の私の質問の下で、レイアウトテンプレートの名前を確認するようになりました。そうだった layouts/admin.haml
. 。 Rails 2では、そのレイアウトはHTML要求のみレンダリングされていましたが、Rails 3ではすべてのリクエストに適用されます(フォーマットタイプを指定しないため)。に名前を変更しました layouts/admin.html.haml
そして、それはシンプルで動作します layout 'admin'
私のコントローラーで(私の質問で思いついたハックとは対照的に)。
質問に対する答え「RailsはRJSテンプレートをレイアウト内でレンダリングするのはなぜですか?」レイアウトファイルには、すべての形式に適用されるように名前が付けられています。
他のヒント
あなたの計算に答える:
1. JS形式のレイヤーレイアウトをRails Railsレイアウトする魔法はありません。これは、それを避けるように明示的に指示しない限り、任意のテンプレートでレイアウトをレンダリングするレールにデフォルトであることです。ファイル内のRailsソースを調べることができます。 actionpack/lib/action_controller/metal/renderers.rb
表示する:JSレンダラー。
2.使用すること:
respond_to do |format|
format.js { render *your_any_options*, layout: false }
end