1

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からインストールされている) アップグレードする必要がありました。私たちが抱えていた問題の 1 つは、テーブルの検索が機能しないことでした。ログファイルに次のように表示されます。rails-3.0git://github.com/activescaffold/active_scaffold

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 を実行できます)。私の質問は、レイアウトを使用して RJS テンプレートをレンダリングしないように Rails に指示する必要があるのはなぜですか? そして、より良い解決策はありますか?これは私にはハックが多すぎるように感じます (悪い種類のハック --- 将来壊れる種類のハック)。

4

2 に答える 2

4

Okay, I figured it out. @numbers1311407's comment under my question led me to check the name of the layout template. It was layouts/admin.haml. With Rails 2, that layout was only rendering for HTML requests, but with Rails 3 it applies to all requests (because it doesn't specify a format type). I renamed it to layouts/admin.html.haml and it works with a simple layout 'admin' in my controller (as opposed to the hack that I had come up with in my question).

So the answer to the question, "Why does Rails render RJS templates within a layout?" is that the layout file was named such that it applies to all formats.

于 2011-09-11T18:17:36.000 に答える
0

あなたの主張に答えてください:1。Rails
レンダラーがJSフォーマットのためにレイアウトする魔法はありません。これは、明示的に回避するように指示しない限り、任意のテンプレートでレイアウトをレンダリングすることがデフォルトでRailsに設定されているためです。ファイル内のRailsソースを調べることができますactionpack/lib/action_controller/metal/renderers.rb::jsレンダラーを確認してください。

2.使用してみてください:

respond_to do |format|
  format.js { render *your_any_options*, layout: false }
end
于 2011-09-11T04:38:28.407 に答える