Я создал несколько контроллеров и представлений в пространстве имен "admin", но они все еще вытягиваются из макета приложения. как я могу сделать макет, который применяется ко всем представлениям на маршрутах, расположенных по именам, и по-прежнему использовать текущий макет для других страниц?
Рельсы 3: макет для маршрутов с именами
Ответ 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