2

このStack Overflow questionでは、質問の最後でこの問題に対処し始めていますが、それは主な質問ではなく、既に回答されています。

と の両方に含まれるモジュールがありApplicationControllerますMyEngineController。モジュールのインスタンス メソッドの一部が、login_urlまたは他の名前付きルートを使用しているとします。ApplicationController からは機能しますが、からは機能しませんMyEngineController。それを に置き換えるとmain_app.login_url、両方で機能しますが、それは非常に冗長に思えます。とにかく、コードが既に gem 依存関係の一部である場合はどうなるでしょうか? コーディングしているエンジンから事後的に動作させるにはどうすればよいですか?

名前付きヘルパーを使用しようとすると、次のようになります。

ActionController::RoutingError: 
    No route matches {:action=>"new", :controller=>"sessions"}
actionpack-3.2.8/lib/action_dispatch/routing/route_set.rb:532:in `raise_routing_error'
actionpack-3.2.8/lib/action_dispatch/routing/route_set.rb:528:in `rescue in generate'
actionpack-3.2.8/lib/action_dispatch/routing/route_set.rb:520:in `generate'
actionpack-3.2.8/lib/action_dispatch/routing/route_set.rb:561:in `generate'
actionpack-3.2.8/lib/action_dispatch/routing/route_set.rb:586:in `url_for'
actionpack-3.2.8/lib/action_dispatch/routing/url_for.rb:148:in `url_for'
actionpack-3.2.8/lib/action_dispatch/routing/route_set.rb:213:in `login_url'

:controller=>"sessions"必要があることに注意してください:controller=>"/sessions"(ルート名前空間に配置するためのスラッシュを使用)が、それは私が知る限り、名前付きルートに渡すことができるオプションではありません。このコードを追加してみました:

extend ActiveSupport::Concern
included do
  main_app.install_helpers(self)
end

MyEngineController で、しかしそれは助けにはなりませんでした。(install_helpers文書化が非常に不十分です。誰が何をすべきか説明できますか?)

4

1 に答える 1

2

今のところ、このソリューションを使用しています (MyEngineController 内):

protected
def url_for options=nil
  begin
    super options
  rescue ActionController::RoutingError
    main_app.url_for options
  end
end

一般に、例外はフロー制御に使用されるべきではないため、私はそれが好きではありません。それで、他にどんな提案がありますか?

于 2012-10-15T02:36:25.790 に答える