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

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!

Предполагается ли, что поведение должно иметь разные макеты приложения, используемые в зависимости от того, к какому пути доступа к приложению обращаются в первую очередь? Конечно, не?? Я должен делать что-то неправильно!

4b9b3361

Ответ 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