2

レール 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 メソッドを見つけることができません。

4

1 に答える 1

2

エンジンを使用している場合、ルートがメイン アプリまたはエンジンのどちらであるかを指定する必要があります。これを行うことができるメイン アプリケーションからの場合は、

main_app.event_path

それがbase2_cmsエンジンからのものであれば、置くことができます

base2_cms.event_path

または base2_cvb エンジンの場合:

base2_cvb.event_path

ルートの場所を指定しない場合は、現在のエンジンのルートを検索するか、どのエンジンにもいない場合はメイン アプリから検索します

于 2013-10-18T02:26:05.367 に答える