0

ルート.rbで指定されているように、指定されたレイアウトテンプレートを特定のコントローラーとその中にネストされているすべてのリソースに自動的に割り当てることは可能ですか?このレイアウトは、指定されたコントローラービューとその中にネストされたビューのみを適用する必要があります。application.html.erbのように、アプリケーション内のすべてのビューに適用する必要はありません(実際には、ネストされたレイアウトのアプリケーションレイアウトで特殊なレイアウトを使用しています)。

だから、例えば、私が持っていた場合

map.resources :news, :shallow => true do |n|
  n.resources :articles do |a|
    a.resources :comments
  end
end

のようなURLにアクセスすると、レイアウトが実際に動作しているlocalhost/news/1/articles/newことがわかります。news.html.erb今のところ、私はしません。

親内にネストされたコントローラーごとに同じレイアウトファイルを再作成したくないことは明らかです(レイアウトを引き出して共有パーシャルに配置する場合でも)。特定のコントローラー自体でレイアウトテンプレートを指定することについては、さらにわくわくしません(この特定の例は一時的なものですが、これについては少し先に「実際の」ユースケースがあります)。

ありがとう!

4

3 に答える 3

1

明確にするために元の質問を編集して(答えは中心的な問題に完全には答えていませんでした)、私がする必要があるのは、ネストされたコントローラークラスをトップレベルの親から継承させることであることに気付きました。これにより、中心的な問題の解決が容易になるだけでなく、私を悩ませてきた他のいくつかの問題が修正されます。

(私は「a'doy」と言いますが、このアプリに取り組んでいる他の人がいて、通常はもう少し明白になるものを覆い隠していました。)

于 2009-12-11T17:16:26.410 に答える
0

news.html.erbの問題について、それはタイプミスですか?news.html.erbファイルではなく、views / articlesフォルダー(デフォルトのレイアウトを想定)にあるnew.html.erbファイルが表示されます。@newsインスタンス変数が設定されていること、およびform_forが@articleだけでなく[@ news、@article]用であることを確認する必要があります。

また、コントローラーごとにレイアウトを作成する必要はありません。layoutsフォルダーに1つのapplication.html.erbを作成でき、layoutsフォルダーにレイアウトがないすべてのコントローラーはapplication.html.erbを使用します。コントローラで指定する必要はありません。コントローラと同じ名前のレイアウトを削除するだけです。

于 2009-12-09T23:09:51.340 に答える
0

コントローラー自体でレイアウトテンプレートを指定することに、私はさらに興奮していません。」

これについて心配する理由はありません。これは単にあなたがすることです。これは、この目的のために特別に作成された1行のDSLコードです。不格好ではありません。

class ArticlesController < ActionController::Base
  layout :news
end
于 2009-12-11T05:36:15.420 に答える