2012-04-06 15 views
18

Tengo dificultades para comprender cómo Rails 3.2 aplica diseños cuando se usan motores montables.Rails 3.2 Diseños de motor

Escenario: Estoy construyendo un motor que a su vez tiene una vista de tablero y una vista de administrador para varias funciones administrativas. Quiero que el tablero tenga su diseño reemplazable por la aplicación base (si el usuario lo desea) pero el administrador siempre debe usar su propio diseño.

Esto es lo que tengo en este momento dentro de mi motor;

application_controller.rb

module Myengine 
    class ApplicationController < ActionController::Base 

admin/dashboard_controller.rb

module Myengine                           
    class Admin::DashboardController < ApplicationController 

ahora tengo mis motores application.html.erb aplicar un fondo rojo horrible mientras que el application.html.erb aplicaciones de base usa un fondo amarillo agradable para poder distinguir qué diseño de aplicación se está aplicando.

En esta situación, si tengo acceso a la aplicación base primero, veo mi fondo amarillo (desde la aplicación base) y si voy al motor y a la ruta de administración del motor, el fondo amarillo permanece.

Si reinicio el servidor y accedo primero al motor, entonces veo el fondo rojo para el motor y la ruta del administrador del motor, mientras que la aplicación base muestra el fondo amarillo.

Si modifico mi admin/dashboard_controller.rb de la siguiente manera;

module Myengine 
    class Admin::DashboardController < ApplicationController 
    layout 'myengine/application' 

lo cual esperaría que sólo se aplican al controlador del motor/admin - pero si reinicio el servidor y acceder a la ruta del motor/admin veo el fondo rojo, mientras que la vista raíz del motor utiliza la aplicación base diseño amarillo.

Si reinicio el servidor nuevamente y accedo a la raíz del motor montado obtengo el fondo rojo aplicado que también permanece en la ruta de administración del motor.

Aaaaarggggghhhhh!

¿Se espera que el comportamiento tenga diferentes diseños de la aplicación utilizada según la ruta de acceso de la aplicación primero? ¿¿Seguramente no?? ¡Debo estar haciendo algo mal!

+0

me di cuenta el mismo comportamiento con https://github.com/grigio/rails_container_and_engines :(pero añado el tema del motor a la main_app uno con < % = stylesheet_link_tag request.env ["action_dispatch.routes"]. routes.routes [0] .defaults [: controller],: media => "all"%> – grigio

Respuesta

15

He depurado el problema y en realidad no es un error en los motores. El problema es causado por la forma en que se cargan las dependencias de los raíles.

Este código se comportará de manera diferente en 2 escenarios que usted está mostrando:

module Enginedemo 
    class DashboardController < ApplicationController 
    end 
end 

Si ApplicationController ya está cargado, rieles asumirá que sólo queremos utilizarlo y que en realidad no va a heredar de Enginedemo::ApplicationController pero desde ApplicationController. En el otro escenario, cuando carga por primera vez el controlador del motor, ApplicationController aún no está cargado, por lo que Rails hace lo correcto.

Afortunadamente este problema ocurre solo en el entorno de desarrollo, ya que los controladores de producción se cargan cuando la aplicación se inicia.

No estoy seguro de si esto es algo que se puede solucionar fácilmente en dependencias de rieles, lo echaré un vistazo.

Por ahora, por favor, requiere explícitamente controlador de aplicación:

require 'enginedemo/application_controller' 

module Enginedemo 
    class DashboardController < ApplicationController 
    end 
end 
+18

O bien, como alternativa, haga referencia a la constante correcta: 'class DashboardController < Enginedemo :: ApplicationController' para que no tenga que cargarlo explícitamente en todas partes. –

+1

Gracias, estaba teniendo el mismo problema en Rails 4.2.1. Tres años después, la respuesta sigue siendo muy útil. – dusan

+0

I he ar la macro 'require_dependency' también se puede usar en lugar de require para estas situaciones. – Epigene

Cuestiones relacionadas