如何从主机应用程序可用的Rails 3引擎创建路由?

Per*_*mal 23 ruby-on-rails url-routing rails-routing rails-engines ruby-on-rails-3

我有一个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
Run Code Online (Sandbox Code Playgroud)

app/views/classrooms/new.html.haml:

= form_for @classroom do |f|
  ..
  f.submit
Run Code Online (Sandbox Code Playgroud)

config/routes.rb 在引擎中:

MyEngineName::Engine.routes.draw do
  resources :classrooms
end
Run Code Online (Sandbox Code Playgroud)

config/routes.rb 在app中:

Seabed::Application.routes.draw do
  mount MyEngineName::Engine => '/engine'
  ...
end
Run Code Online (Sandbox Code Playgroud)

lib/my_engine_name.rb 在引擎中:

module MyEngineName
  class Engine < ::Rails::Engine
  end
end
Run Code Online (Sandbox Code Playgroud)

试图进入/classrooms/new结果

NoMethodError in Classrooms#new

Showing app/views/classrooms/_form.html.haml where line #1 raised:
  undefined method `hash_for_classrooms_path' for #<Module:0x00000104cff0f8>
Run Code Online (Sandbox Code Playgroud)

并尝试classrooms_path从任何其他视图调用导致相同的错误.但是,我可以打电话MyEngineName::Engine.routes.url_helpers.classrooms_path让它运转起来.我想我可能已经定义了错误的路线,但找不到另一种有效的方法.

尝试使用Passenger(独立和Apache模块)和WEBrick(rails服务器)运行应用程序.使用Git(7c920631ec3b314cfaa3a60d265de40cba3e8135)的最新Rails .

dav*_*rac 26

我有同样的问题,并在文档中找到了这个:

由于您现在可以在应用程序的路径中安装引擎,因此您无法直接访问Application中的Engine的url_helpers.在应用程序的路径中安装引擎时,会创建一个特殊帮助程序以允许您执行此操作.考虑这样的场景:

# config/routes.rb
MyApplication::Application.routes.draw do
  mount MyEngine::Engine => "/my_engine", :as => "my_engine"
  get "/foo" => "foo#index"
end
Run Code Online (Sandbox Code Playgroud)

现在,您可以在应用程序中使用my_engine帮助程序:

class FooController < ApplicationController
  def index
    my_engine.root_url #=> /my_engine/
  end
end
Run Code Online (Sandbox Code Playgroud)


bow*_*ior 25

config.routes将引擎更改为:

Rails.application.routes.draw do  # NOT MyEngineName::Engine.routes.draw
  resources :classrooms
end
Run Code Online (Sandbox Code Playgroud)

您拥有它的方式,路由只能在MyEngineName::Engine命名空间中使用,而不能在其他主机应用程序中使用.

曾经有一篇博文有更多信息,但遗憾的是它不再可用:

  • 对于Rails 3.1及更高版本,删除块的`map`参数(只删除整个`| map |`部分). (2认同)