Ruby on rails 如何使Rails 3引擎的路由可用于主机应用程序?

Ruby on rails 如何使Rails 3引擎的路由可用于主机应用程序?,ruby-on-rails,ruby-on-rails-3,url-routing,rails-routing,rails-engines,Ruby On Rails,Ruby On Rails 3,Url Routing,Rails Routing,Rails Engines,我有一个Rails 3应用程序,其中包含多个包含附加功能的引擎。每个引擎都是一项单独的服务,客户可以购买该服务 但是,我对来自引擎的路由有一个问题,控制器和视图无法立即使用这些路由 控制器: class ClassroomsController < ApplicationController .. respond_to :html def index respond_with(@classrooms = @company.classrooms.all) end

我有一个Rails 3应用程序,其中包含多个包含附加功能的引擎。每个引擎都是一项单独的服务,客户可以购买该服务

但是,我对来自引擎的路由有一个问题,控制器和视图无法立即使用这些路由

控制器:

class ClassroomsController < ApplicationController
  ..
  respond_to :html

  def index
    respond_with(@classrooms = @company.classrooms.all)
  end

  def new
     respond_with(@classroom = @company.classrooms.build)
  end

  ..
end
config/routes.rb
在引擎中:

MyEngineName::Engine.routes.draw do
  resources :classrooms
end
module MyEngineName
  class Engine < ::Rails::Engine
  end
end
config/routes.rb
应用程序中:

Seabed::Application.routes.draw do
  mount MyEngineName::Engine => '/engine'
  ...
end
lib/my\u engine\u name.rb
在引擎中:

MyEngineName::Engine.routes.draw do
  resources :classrooms
end
module MyEngineName
  class Engine < ::Rails::Engine
  end
end
试图从任何其他视图调用
u路径
,也会导致相同的错误。 但是,我可以调用
MyEngineName::Engine.routes.url\u helpers.path
并使其工作。我想我可能定义了错误的路线,但找不到其他可行的方法


尝试使用Passenger(单机版和Apache模块)和WEBrick(rails服务器)运行该应用程序。使用Git的最新Rails(
7c920631ec3b314cfaa3a60d265de40cba3e8135
)。

将引擎中的
配置路由更改为:

Rails.application.routes.draw do  # NOT MyEngineName::Engine.routes.draw
  resources :classrooms
end
按照您的方式,路由仅在
MyEngineName::Engine
命名空间中可用,而在宿主rails应用程序的其余部分中不可用

以前有一篇包含更多信息的博文,但不幸的是,它不再可用:


    • 对我来说,这也有助于添加

      require 'engine' if defined?(Rails)
      
      到我的主gem文件(lib/.rb)


      很好的例子-

      我也遇到了同样的问题,并且在:

      因为您现在可以在应用程序的路由中挂载引擎,所以您不能直接访问应用程序中引擎的url\U帮助程序。当您在应用程序的路由中装载引擎时,将创建一个特殊的帮助器,以允许您执行此操作。考虑这样一个场景:

      # config/routes.rb
      MyApplication::Application.routes.draw do
        mount MyEngine::Engine => "/my_engine", :as => "my_engine"
        get "/foo" => "foo#index"
      end
      
      现在,您可以在应用程序中使用my_engine助手:

      class FooController < ApplicationController
        def index
          my_engine.root_url #=> /my_engine/
        end
      end
      
      class FooController/my_engine/
      结束
      结束
      
      这样做,删除我的应用程序路由中的mount调用,并在引擎路由中确定作用域(
      scope'/engine'do
      ),一切正常。非常感谢:)很酷,感谢您提供了使引擎路由正常工作所需的其他步骤的信息。对于Rails 3.1和更高版本,请删除块中的
      map
      参数(只需删除整个
      | map
      部分)。如果我在主应用程序的底部有一条全面的路由怎么办?如何确保这些引擎的路由不只是附加到主机应用程序路由的底部?@Jwan622对此不确定。这个答案中可能有一些有用的信息:对于引擎内部的代码,是否还需要使用引擎的名称预先将路由发送到它自己的控制器?或者您可以从引擎内部使用
      u路径
      ?Jwan622,对于自己的路由,您可以使用没有任何前缀的助手。