レール 3.2.12 2013 年 2 月 27 日
「 Event 」と呼ばれるモデルを持つbase2_cmsと呼ばれるフル Rails エンジンがあります。Rails サーバーを使用してエンジンを実行しても問題はありません。
次に、gem としてパッケージ化されたbase2_cmsを使用して、 base2_cvbと呼ばれる別のフル Rails エンジンです。これは問題ありません。
次に、アプリケーションはこれらのエンジンの両方を gem として使用します。エンジンが最初に登場したときからこれを行ってきましたが、最近多くの変更を加えました。どこかで、ルーティングが機能しなくなりました。または、より正確には、Rails url リンク ヘルパー メソッドだと思います。
アプリケーション レベルで、イベントのインスタンスとして 2 番目のパラメーターを指定して 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 メソッドを見つけることができません。