рельсы 3: расположение маршрутов в пространстве имен - PullRequest
31 голосов
/ 19 ноября 2010

Я создал несколько контроллеров и представлений в пространстве имен 'admin', но они все еще извлекаются из макета приложения. Как я могу сделать макет, который применяется ко всем представлениям в маршрутах пространства имен, и при этом использовать текущий макет для других страниц?

Ответы [ 2 ]

41 голосов
/ 19 ноября 2010

У меня обычно есть класс контроллера 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
36 голосов
/ 19 ноября 2010

Вообще говоря, 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, и он будет наследоватьмакет администратора.

Я не знаю особенностей вашего кода, но у вас может быть:

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, вы можете создать его без каких-либо действий только для целей макета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...