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

31

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

2个回答

45

我通常在我的命名空间中有一个基础控制器类,然后让所有的控制器都继承自它。这使得我可以将公共的、命名空间特定的代码放在基础类中,而该命名空间中的所有控制器都可以受益。例如:

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
这个基础控制器应该放在哪里? - Sebastialonso
3
控制器类是Admin::BaseController,因此Rails假定它将在controllers/admin文件夹中的base_controller.rb文件中定义。 - IAmNaN
我如何创建布局文件 ***(html.erb)***,并仅调用在 stylesheetsjavascripts 文件夹下的 admin 文件夹中创建的特定 CSS 和 JS 文件? - alexventuraio

36

通常情况下,如果没有与控制器匹配的布局,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。

但如果你想要进行分组,这可能是一种更好的方式: 如果你有一个基础AdminController从ApplicationController继承,你可以让你的Admin::PersonController从AdminController继承,它就会继承admin布局。

我不知道你代码的具体情况,但你可能会有:

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会继承AdminControler所定义的任何动作(就像ApplicationController中定义的内容在所有子类中都可以使用一样)。这通常不是问题,因为你可能会覆盖这些方法,但要注意。如果你没有AdminController,你可以创建一个没有动作的AdminController,只供布局使用。


2
class AdminController 是在 app/controllers 还是 app/controllers/admin 下面? - jdscosta91
app/controllers 下面。 - Damien
我正在尝试这个,它似乎可以工作,但是我失去了像Bootstrap或Semantic-UI这样的框架所提供的样式和功能。有什么解决办法吗? - Sebastialonso
我认为使用 AdminController 来渲染所有管理页面的主要“index”页面并不是一个好主意,因为从它继承的所有控制器也将继承该 show 操作。我认为最好创建另一个单独的控制器,它继承自 admin 控制器,例如 dashboard,然后在其中拥有一个 index 操作。 - Inkling
@delba 你确定它不在 app/controllers/admin 下面吗?我的 Rails 4 项目就是这样设置的,后者也可以工作。 - FloatingRock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接