Подтвердить что ты не робот

Рельсы 3: макет для маршрутов с именами

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

4b9b3361

Ответ 1

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

Ответ 2

Обычно у меня есть класс базового контроллера в моем пространстве имен, а затем все контроллеры в этом пространстве имен наследуются от него. Это позволяет мне использовать общий, именный код в 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