ruby-on-rails ruby-on-rails-3.1 rails-engines rails-3.1

ruby on rails - Acceda a los Ayudantes de aplicaciones principales cuando anule una vista/diseño de Rails Engine



ruby-on-rails ruby-on-rails-3.1 (5)

Descargo de responsabilidad: solo he utilizado esta solución en los motores Rails 3.2.

Si, en su motor, tiene un encabezado estándar proveedor parcial / gems / my_gallery_engine / app / views / application / _header.html.erb .

Luego, anule en su aplicación principal creando una aplicación / views / application / _header.html.erb parcial personalizada.

La anulación funciona porque la ruta de búsqueda de la plantilla de la vista de Rails (de forma predeterminada) comienza con el directorio de aplicaciones / vistas de las aplicaciones principales, y luego busca en las aplicaciones / vistas de los motores en orden de carga.

Todos los Ayudantes de la aplicación principal estarán disponibles en forma parcial.

He creado un simple Rails Engine para proporcionar alguna funcionalidad general (galería de fotos) a una aplicación. Quiero poder anular el _header parcial estándar para que el menú de la galería coincida con el de mi aplicación principal. En mi vista de encabezado, llamo a un ayudante que forma parte de application_helpers (aplicación principal), pero sigo recibiendo errores de "método no definido". Por lo que puedo decir, la aplicación principal no ayuda a los colaboradores de la aplicación (obviamente) cuando anulo el diseño de la aplicación del motor o sus parciales.

Entonces, mi pregunta es, ¿cómo anulo una vista de motor en la aplicación principal y obtengo acceso a los métodos de ayuda de la aplicación principal? Todavía necesitaría acceso a los ayudantes del motor y no a la función del motor.

¿Necesito anular los controladores también? Parece mucho solo para conseguir algunos ayudantes.

Gracias

Rieles 3.1.3


Se supone que los motores son independientes de la aplicación principal, es por eso que no puede acceder a sus ayudantes desde el motor.

Sin embargo, hay formas piratas de dar acceso a su motor a los ayudantes de la aplicación principal. Así es como lo hice:

# In the main app # initializers/share_helpers_path_with_engine.rb PhotoGallery::Engine.class_eval do paths["app/helpers"] << File.join(File.dirname(__FILE__), ''../..'', ''app/helpers'') end

Por supuesto, necesita cambiar PhotoGallery al nombre real de su clase de motor.

No dude en echar un vistazo a la documentación de los motores (sección sobre las rutas): http://edgeapi.rubyonrails.org/classes/Rails/Engine.html


Trate de incluir los principales métodos de aplicación de ayuda. Por ejemplo:

class MyEngineClass include ApplicationHelper #... end

Es posible que deba solicitar el archivo primero, aunque espero que Rails lo encuentre correctamente en este caso.

Una vez que se incluye ApplicationHelper, debe poder usar directamente a esos ayudantes en el controlador.

También parece que puede llamar a ClassName.helper("application") para muchas clases de Rails; no estoy seguro de si funcionará aquí.


echa un vistazo a esta publicación del blog: http://www.candland.net/2012/04/17/rails-routes-used-in-an-isolated-engine/ El autor agrega una definición de method_missing al ayudante de la aplicación para acceder Los ayudantes de la aplicación principal.

/config/initializers/blogit.rb

module Blogit module ApplicationHelper def method_missing method, *args, &block puts "LOOKING FOR ROUTES #{method}" if method.to_s.end_with?(''_path'') or method.to_s.end_with?(''_url'') if main_app.respond_to?(method) main_app.send(method, *args) else super end else super end end def respond_to?(method) if method.to_s.end_with?(''_path'') or method.to_s.end_with?(''_url'') if main_app.respond_to?(method) true else super end else super end end end end


intente crear un ayudante en su aplicación con el mismo nombre del ayudante en su motor para anular los métodos del ayudante del motor.

Encontré esta discusión particularmente perspicaz. También hay algunas ideas interesantes en los documentos API de Rails Engine en Ayudantes de motor aislados .