Rails 3.2.12 2/27/2013
我们有一个名为 base2_cms 的完整导轨引擎,其模型名为“事件”。使用rails服务器运行引擎没有问题。
接下来,另一个名为 base2_cvb 的完整rails引擎使用 base2_cms 打包为gem.No问题。
接下来,应用程序将这两个引擎用作宝石。自从引擎首次出现以来,我们一直在这样做,但最近做了很多改变。沿线的某处,路由停止工作。或者我想更准确地说,rails url链接帮助方法。
在应用程序级别,当使用link_to和第二个参数作为事件的实例时,会发生以下错误:
undefined method `event_path' for #<#<Class:0x007f82d52b3c20>:0x007f82d52a7240>
堆栈跟踪:
actionpack (3.2.11) lib/action_dispatch/routing/polymorphic_routes.rb:129:in `polymorphic_url'
actionpack (3.2.11) lib/action_dispatch/routing/polymorphic_routes.rb:135:in `polymorphic_path'
actionpack (3.2.11) lib/action_view/helpers/url_helper.rb:111:in `url_for'
actionpack (3.2.11) lib/action_view/helpers/url_helper.rb:242:in `link_to'
base2_cms (0.9.40) app/helpers/application_helper_fieldset.rb:31:in `fieldset_combined_title'
base2_cms (0.9.40) app/helpers/application_helper_index.rb:35:in `index_start'
base2_cms (0.9.40) app/views/organizations/index.html.erb:2:in
这不是特定的多态相关,因为我们有其他类似的问题,例如在不同的情况下得到此错误:
In order to use #url_for, you must include routing helpers explicitly. For instance, `include Rails.application.routes.url_helpers
我们已尝试以各种方式遵循此最后建议,但未在许多其他尝试的解决方案中取得成功。
在应用程序级别运行rake路由会返回有关事件模型的以下内容:
GET /events/:id/copy(.:format) events#copy
DELETE /events/:id/remove_organization(.:format) events#remove_organization
POST /events/:id/add_organization(.:format) events#add_organization
GET /events(.:format) events#index
POST /events(.:format) events#create
GET /events/new(.:format) events#new
GET /events/:id/edit(.:format) events#edit
GET /events/:id(.:format) events#show
PUT /events/:id(.:format) events#update
DELETE /events/:id(.:format) events#destroy
在最终应用程序级别使用rails控制台,我们甚至可以这样做:
1.9.2-p320 :011 > app.event_path(9)
=> "/events/9"
1.9.2-p320 :012 > app.event_path(Event.find(88))
Event Load (13.1ms) SELECT "events".* FROM "events" WHERE "events"."id" = $1 LIMIT 1 [["id", 88]]
=> "/events/88"
但是,在视图中使用link_to时,它无法找到顶部所描述的event_path方法。
答案 0 :(得分:2)
当您使用引擎时,您必须指定路由是主应用程序还是引擎,如果它来自主应用程序,您可以使用
main_app.event_path
如果它来自base2_cms引擎你可以放
base2_cms.event_path
或者如果它是base2_cvb引擎:
base2_cvb.event_path
如果您没有指定路线的位置,它将搜索当前引擎的路线,或者如果您不在任何引擎中,则从主应用程序搜索