【问题标题】:rails 3: layout for namespaced routesrails 3:命名空间路由的布局
【发布时间】:2011-05-12 10:24:33
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails layout


    【解决方案1】:

    我通常在我的命名空间中有一个 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
    

    【讨论】:

    • 我认为这比公认的答案更优雅、更有条理。有没有办法让rails g命令生成的所有控制器都继承自Admin::BaseController
    • 这个基本控制器应该去哪里?
    • 控制器类是 Admin::BaseController,所以 Rails 假设它定义在 controllers/admin 文件夹的 base_controller.rb 文件中。
    • 如何创建布局文件 (html.erb) 并且只调用在 下创建的特定 CSS 和 JS 文件admin 文件夹分别在stylesheetsjavascripts 文件夹中?
    【解决方案2】:

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

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

    class Admin::PeopleController
      layout 'some_layout'
    end
    

    然后该控制器将使用 some_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,您可以制作一个不带任何操作的控制器,仅用于布局。

    【讨论】:

    • class AdminControllerapp/controllersapp/controllers/admin 下?
    • app/controllers
    • 我正在尝试这个,它似乎有效,但我失去了 Bootstrap 或 Semantic-UI 等框架提供的样式和功能。知道如何解决这个问题吗?
    • 我认为使用AdminController 为所有管理内容呈现主“索引”页面不是一个好主意,因为从它继承的所有控制器也将继承show 行动。我认为最好创建另一个从admin 控制器继承的独立控制器,例如dashboard,然后在其中有一个index 操作。
    • @delba 你确定它不在app/controllers/admin 下吗?我的 Rails 4 项目就是这样设置的,并且可以与后者一起使用。
    猜你喜欢
    • 1970-01-01
    • 2011-10-10
    • 2011-08-29
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    相关资源
    最近更新 更多