2010-11-19 19 views
31

私はadminの名前空間の下で多数のコントローラ&ビューを作成しましたが、まだアプリケーションのレイアウトから抜け出しています。名前空間のルート内のすべてのビューに適用されるレイアウトを作成するにはどうしたらいいですか?rails 3:名前空間を使ったルートのレイアウト

答えて

36

一般的に言えば、Railsはコントローラと一致するレイアウトがない場合、アプリケーションレイアウトを使用します。たとえば、PeopleControllerがある場合、Railsはlayouts/people.html.erbを探し、見つからなければapplication.html.erbを探します。

この規則を無効にする場合は、特定のレイアウトを明示的に指定することができます。コントローラは、その後、むしろpeople.html.erbとapplication.html.erbを探して比べてsome_layout.html.erbを使用します

class Admin::PeopleController 
    layout 'some_layout' 
end 

しかし、あなたはグループ物事に探しているなら、これは良い方法かもしれません:あなたはApplicationControllerにから継承ベースAdminControllerを持っている場合、あなたは、たとえば、管理者を持つことができます:: PersonControllerがAdminControllerから継承し、それ管理者のレイアウトを継承します。

私はあなたのコードの詳細を知りませんが、あなたは可能性があります:

class AdminController 
    def show 
    #render a template linking to all the admin stuff 
    end 
end 

app/controllers/admin/people_controller.rb: 
class Admin::PeopleController < AdminController 
    #your awesome restful actions in here! 
end 

views/layouts/admin.html.erb: 
Hello from the Admin! 
<%= yield %> 

実現する一つのことは、管理:: PeopleControllerがAdminControllerは何でもと(定義された任意のアクションを継承するということですApplicationControllerで定義されているすべてのサブクラスで使用可能になります)。とにかくメソッドを上書きする可能性があるので、これは一般的に問題ではありませんが、それを認識するだけです。 AdminControllerを持っていない場合は、レイアウト目的のためだけにアクションを行わないでください。

+2

'class AdminController'は' app/controllers'または 'app/controllers/admin'にありますか? – jdscosta91

+0

'app/controllers'の下で – Damien

+0

私はこれを試していますが、うまくいくようですが、BootstrapやSemantic-UIのようなフレームワークで与えられたスタイルと機能を失います。どのようにこれを解決するための任意のアイデア? – Sebastialonso

40

私は通常、自分のネームスペースにBaseコントローラクラスを持ち、そのネームスペース内のすべてのコントローラを継承します。これにより、共通の名前空間固有のコードをBaseに入れ、その名前空間内のすべてのコントローラを利用することができます。例:

class Admin::BaseController < ApplicationController 
    layout 'admin' 
    before_filter :require_admin_user 
end 

class Admin::WidgetsController < Admin::BaseController 
    # inherits the 'admin' layout and requires an admin user 
end 
+2

私はこれが受け入れられた答えよりもエレガントで構造化されていると思います。 'rails g'コマンドで生成されたすべてのコントローラを' Admin :: BaseController'から継承させる方法はありますか? – berezovskyi

+0

このベースコントローラはどこに行きますか? – Sebastialonso

+3

コントローラクラスはAdmin :: BaseControllerです。したがって、Railsはcontrollers/adminフォルダ内のbase_controller.rbファイルで定義されているものと見なします。 – IAmNaN

関連する問題