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

GSt*_*Sto 31 layout ruby-on-rails

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

Ale*_*lex 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
Run Code Online (Sandbox Code Playgroud)

  • 控制器类是Admin :: BaseController,因此Rails假定它将在controllers/admin文件夹的base_controller.rb文件中定义. (3认同)
  • 我认为这比接受的答案更优雅,更有条理.有没有办法让`rails g`命令生成的所有控制器继承自`Admin :: BaseController`? (2认同)

小智 36

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

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

class Admin::PeopleController
  layout 'some_layout'
end
Run Code Online (Sandbox Code Playgroud)

然后该控制器将使用some_layout.html.erb而不是查找people.html.erb和application.html.erb.

但是如果你想要分组的话,这可能是一个更好的方法: 如果你有一个继承自ApplicationController的基本AdminController,你可以让你的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 %>
Run Code Online (Sandbox Code Playgroud)

要实现的一件事是Admin :: PeopleController将继承AdminController定义的任何操作(就像在ApplicationController中定义的任何操作在所有子类中都可用).这通常不是问题,因为无论如何你可能会覆盖这些方法,但只是要意识到它.如果您没有AdminController,则可以仅针对布局创建一个不执行任何操作的控制器.

  • `class AdminController`在`app/controllers`或`app/controllers/admin`下? (2认同)