9

Rails エンジンを使用する Ruby on Rails 3(.0) アプリケーションに取り組んでいます。しかし、私のローカル アプリケーションでは、Rails エンジンが提供するルートの 1 つをオーバーライドしたいと考えています。

エンジン config/routes.rb から:

match 'their_named_route' => 'controller#action', :as => 'the_route'

私のアプリケーション config/routes.rb から:

match 'my_named_route' => 'controller#action', :as => 'the_route'

ただし、ルートを調べると、両方がアクティブであるように見えます (少なくともエンジンコントローラー内では、ルートが「勝つ」ように見えます)。

$ rake routes
the_route  /my_named_route(.:format)    {:controller=>"controller", :action=>"action"}
the_route  /their_named_route(.:format) {:controller=>"controller", :action=>"action"}

ローカル アプリケーションの名前付きルートを強制的に優先させる良い方法はありますか?

4

7 に答える 7

8

これを回避するには、エンジンのルートをconfig/routes.rbからエンジンクラス自体のクラスメソッドに移動します。

module MyEngine
  class Engine < Rails::Engine
    def self.routes
      MyRailsApp::Application.routes.draw do
        resources :products
      end
    end
  end
end

次に、ベースアプリのルートファイルで:

MyRailsApp::Application.routes.draw do
  # Routes for base app including the ones overriding MyEngine::Engine.

  MyEngine::Engine.routes
end

その後、ベースアプリのルートをエンジンのルートでうまくオーバーライドできます。

以前に定義されたルートが後のルートよりも優先されるため、オーバーライドされたルートの前にオーバーライドするルートを定義する必要があることに注意してください。

于 2011-08-25T04:51:10.907 に答える
6

そんな簡単な方法はないのではないかと心配しています。ルートは で定義されlib/action_dispatch/routing/mapper.rb:271、RouteSet で add_route を呼び出します ( で定義されrack-mount-0.6.14/lib/rack/mount/route_set.rb、71 行目に名前が付加されています)。remove_route メソッドはなく、エンジンのルートは最後に追加されます。アプリケーションの初期化後に、routes.rb ではなく Rails.application.routes.draw でルートを手動で追加するか、エンジンにパッチを適用することができます。

于 2011-05-16T14:17:45.603 に答える
4

エンジン内でルートをオーバーライドする方法はありません。代わりに、上書きルートを定義する必要があります。prependこれを行うには、エンジンのルーターを呼び出します。

An::Engine.routes.prepend do
  root :to => "somewhere#action"
end

エンジンの名前空間が分離されている場合、これはSomewhereControllerエンジンの名前空間内の from を使用します。そうでない場合は、典型的なSomewhereController.

ルートをオーバーライドして 404 を返したい場合、私が考える最善の方法は、404 ページにリダイレクトすることです。

match "/route_goes_here" => redirect("/404")
于 2013-02-19T21:26:39.217 に答える
2

次のように、config/application.rb に初期化フックを追加する必要があります。

class Application < Rails::Application

  config.encoding = "utf-8"

  ...

  initializer :add_routing_paths do |app|
    their_routes_path = app.routes_reloader.paths.select{|path| path =~ /DIR/}.first
    app.routes_reloader.paths.delete(their_routes_path)
    app.routes_reloader.paths.unshift(their_routes_path)
  end
end

最初にエンジンの roues.rb をロードし、それらのルートをオーバーライドできます。

于 2011-05-17T08:48:56.630 に答える
2

上記の Ryan Bigg によって提案されているように、ルートを先頭に追加できます。カスタム ルートで名前付きルート ヘルパーを無効にするには、次のようappendに の代わりに呼び出す必要があることがわかりました。prepend

An::Engine.routes.append do
  root :to => "somewhere#action"
end

それ以外の場合、アプリには両方のルートが含まれ、エンジンのルーターの名前付きヘルパーが最後の定義であるため、適用されるものになります。

于 2013-03-11T19:53:39.910 に答える