在rails引擎视图中缺少设计路由助手

时间:2012-05-23 00:48:48

标签: ruby-on-rails devise rails-engines

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

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

3 个答案:

答案 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'如果你从标准应用程序中调用它。)