代码之家  ›  专栏  ›  技术社区  ›  GSto

rails 3:命名空间路由的布局

  •  31
  • GSto  · 技术社区  · 14 年前

    我在“admin”命名空间下创建了许多控制器和视图,但它们仍在从应用程序布局中提取。如何创建一个应用于命名空间路由中所有视图的布局,并且仍对其他页使用当前布局?

    2 回复  |  直到 14 年前
        1
  •  36
  •   sph    14 年前

    一般来说,如果没有与控制器匹配的布局,Rails将使用应用程序布局。例如,如果您有一个PeopleController,Rails将查找layouts/people.html.erb,如果找不到,则查找application.html.erb。

    如果要重写此约定,可以显式指定特定布局。

    class Admin::PeopleController
      layout 'some_layout'
    end
    

    然后,该控制器将使用一些“layout.html.erb”,而不是查找people.html.erb和application.html.erb。

    但如果你想把事情分组,这可能是一个更好的方法: 如果您有一个从ApplicationController继承的基本AdminController,您可以让您的Admin::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 %>
    

    要了解的一件事是,Admin::PeopleController将继承AdminController定义的任何操作(就像ApplicationController中定义的任何操作在所有子类中都可用一样)。这通常不是一个问题,因为无论如何,您可能会重写这些方法,但只是为了注意它。如果您没有AdminController,您可以只为布局的目的而不执行任何操作。

        2
  •  41
  •   Alex    14 年前

    我的命名空间中通常有一个基本控制器类,然后该命名空间中的所有控制器都从该类继承。这允许我将通用的、特定于名称空间的代码放在基中,并且该名称空间中的所有控制器都可以利用。例如:

    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