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
命名空间中使用,而不能在其他主机应用程序中使用.
曾经有一篇博文有更多信息,但遗憾的是它不再可用:
归档时间: |
|
查看次数: |
13387 次 |
最近记录: |