9

我正在构建一个名为 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的模板文件中

我无法弄清楚为什么这个路线助手在这种情况下不可用。我究竟做错了什么?

4

3 回答 3

9

采用

main_app.new_user_session_path

那应该工作

于 2012-05-28T15:01:37.730 回答
7

我在主应用程序的 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

我已经在可安装的引擎中使用了它,因此您不必牺牲这些功能。

于 2013-04-11T21:02:06.033 回答
0

根据这个响应,我通过在控制器内部声明来包含在 application_helpers.rb 中找到的所有帮助程序helper "manager/application"(如果“manager”是可挂载引擎的当前命名空间。如果您从标准应用程序调用它,只需使用“application”)。

于 2014-01-23T03:17:40.703 回答