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

时间:2010-11-19 03:33:03

标签: ruby-on-rails layout

我创造了许多控制器& “admin”命名空间下的视图,但它们仍在应用程序布局中。如何制作适用于命名空间路径中所有视图的布局,并仍然使用其他页面的当前布局?

2 个答案:

答案 0 :(得分:41)

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

答案 1 :(得分: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。

但如果你想要分组,这可能是一个更好的方法:如果你有一个继承自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,则可以仅为布局目的制作一个没有操作的。