我正在构建一个名为Engrave的Rails引擎。
我的发动机安装如下:
# Routes.rb of the host app
mount Engrave::Engine => "/engrave", :as => "engrave_engine"
在这个引擎中,我有一个名为“PostsController”的控制器。当我导航到此控制器以查看类似的帖子时:/engrave/posts/1
我收到此错误:
undefined local variable or method `new_user_session_path'
引擎中的PostsController继承自引擎控制器,它继承自应用程序控制器,如下所示:
module Engrave
class PostsController < ApplicationController
...
end
class Engrave::ApplicationController < ApplicationController
end
new_user_session_path由devise定义,我设置如下:
devise_for :users
对new_user_session_path的调用位于主机应用
中的layouts/application.html.erb
模板文件中
我无法弄清楚为什么这个路由助手在这种情况下不可用。我做错了什么?
答案 0 :(得分:9)
使用
main_app.new_user_session_path
应该有效
答案 1 :(得分:6)
我已经成功地在主应用程序的application_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
我在可安装引擎中使用过它,所以你不必牺牲这些功能。
答案 2 :(得分:0)
在this response之后,通过在控制器中声明helper "manager/application"
来说明我在application_helpers.rb中找到的所有助手(如果'manager'是可安装引擎的当前命名空间。只需使用'application'如果你从标准应用程序中调用它。)