Ruby on rails 如何使Rails 3引擎的路由可用于主机应用程序?
我有一个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
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,对于自己的路由,您可以使用没有任何前缀的助手。