Railsがレイアウト内でRJSテンプレートをレンダリングするのはなぜですか?

StackOverflow https://stackoverflow.com/questions/7375845

質問

これを使用するコントローラーのためにこれを行う必要があります 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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top