Rails 3.2 Макеты двигателей
Я пытаюсь понять, как Rails 3.2 применяет макеты при использовании монтируемых движков.
Сценарий: я создаю движок, который сам имеет вид панели управления и административный вид для различных функций администратора. Я хочу, чтобы панель инструментов имела свой макет, переопределяемый базовым приложением (если пользователь хочет), но администратор должен всегда использовать свой собственный макет.
Вот что я имею в данный момент в своем моторе;
application_controller.rb
module Myengine
class ApplicationController < ActionController::Base
админ/dashboard_controller.rb
module Myengine
class Admin::DashboardController < ApplicationController
теперь у меня есть мои приложения application.html.erb, применяющие отвратительный красный фон, в то время как базовые приложения application.html.erb используют приятный желтый фон, поэтому я могу различить, какой макет приложения применяется.
В этой ситуации, если я впервые получаю доступ к базовому приложению, я вижу свой желтый фон (из базового приложения), и если я перейду к движку и движку admin, то желтый фон останется.
Если я перезапущу сервер и сначала приступлю к движку, тогда я вижу красный фон для движка и путь администратора, пока базовое приложение показывает желтый фон.
Если я изменю свой admin/dashboard_controller.rb следующим образом:
module Myengine
class Admin::DashboardController < ApplicationController
layout 'myengine/application'
который я ожидал бы применить только к контроллеру engine/admin, но если я перезапущу сервер и получаю доступ к движку/админу, я вижу красный фон, в то время как корневой вид движка использует желтый макет приложения.
Если я снова перезапущу сервер и получаю доступ к корню установленного механизма, я получаю красный фон, который также остается на пути администратора.
Aaaaarggggghhhhh!
Предполагается ли, что поведение должно иметь разные макеты приложения, используемые в зависимости от того, к какому пути доступа к приложению обращаются в первую очередь? Конечно, не?? Я должен делать что-то неправильно!
Ответы
Ответ 1
Я отлаживал проблему, и на самом деле это не ошибка в Engines. Проблема связана с загрузкой зависимостей рельсов.
Этот код будет вести себя по-разному в двух сценариях, которые вы показываете:
module Enginedemo
class DashboardController < ApplicationController
end
end
Если ApplicationController
уже загружен, рельсы предполагают, что мы просто хотим его использовать, и вы фактически не наследуете от Enginedemo::ApplicationController
, а от ApplicationController
. В другом случае, когда вы впервые загрузите контроллер двигателя, ApplicationController
еще не загружен, поэтому Rails делает все правильно.
К счастью, эта проблема возникает только в среде разработки, поскольку в производственных контроллерах загружаются при загрузке приложения.
Я не уверен, что это то, что можно легко устранить в зависимости от rails. Я посмотрю на него.
В настоящее время явным образом требую применения контроллера приложения:
require 'enginedemo/application_controller'
module Enginedemo
class DashboardController < ApplicationController
end
end