ruby-on-rails - proyecto - scaffold ruby on rails
Falta el diseño de ayudantes de rutas dentro de las vistas del motor de rieles (3)
Estoy construyendo un motor de Rails llamado Engrave.
Tengo el motor montado así:
# Routes.rb of the host app
mount Engrave::Engine => "/engrave", :as => "engrave_engine"
Dentro de este motor tengo un controlador llamado "PostsController". Cuando navego a este controlador para ver una publicación como esta: /engrave/posts/1
obtengo este error:
undefined local variable or method `new_user_session_path''
El controlador de mensajes en el motor hereda del controlador del motor, que hereda del controlador de la aplicación, así:
module Engrave
class PostsController < ApplicationController
...
end
class Engrave::ApplicationController < ApplicationController
end
New_user_session_path está siendo definido por idee, que he configurado como:
devise_for :users
La llamada a new_user_session_path está en el archivo de plantilla layouts/application.html.erb
en la aplicación de host
No puedo entender por qué este asistente de ruta no está disponible en este contexto. ¿Qué estoy haciendo mal?
Utilizar
main_app.new_user_session_path
eso debería funcionar
He tenido éxito haciendo lo siguiente en la aplicación principal help_helper.rb:
module ApplicationHelper
# Can search for named routes directly in the main app, omitting
# the "main_app." prefix
def method_missing method, *args, &block
if main_app_url_helper?(method)
main_app.send(method, *args)
else
super
end
end
def respond_to?(method)
main_app_url_helper?(method) or super
end
private
def main_app_url_helper?(method)
(method.to_s.end_with?(''_path'') or method.to_s.end_with?(''_url'')) and
main_app.respond_to?(method)
end
end
Lo he usado en motores montables, para que no tengas que sacrificar esas características.
Trabajando en esta respuesta , incluyo todos los ayudantes que se encuentran en application_helpers.rb indicando helper "manager/application"
dentro del controlador (si ''manager'' es el espacio de nombre actual de tu motor montable. Solo usa ''application'' si llamas a esto desde una aplicación estándar).