Переопределение именованных маршрутов, предоставляемых Rails 3 Engines - PullRequest
9 голосов
/ 14 мая 2011

Я работаю над приложением Ruby on Rails 3 (.0), которое использует движок Rails. Однако в моем локальном приложении я хочу переопределить один из маршрутов, предоставляемых движком Rails.

Из конфигурации двигателя / rout.rb:

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

Из моего приложения config / rout.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"}

Есть ли хороший способ сделать так, чтобы именованный маршрут моего локального приложения имел приоритет?

Ответы [ 6 ]

8 голосов
/ 25 августа 2011

Я справился с этим, переместив маршруты своего движка из config / rout.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

Затем я могу с радостью переопределить любые маршруты в базовом приложении и маршруты в движке.

Обратите внимание, что переопределенные маршруты должны быть определены до переопределенных маршрутов, поскольку ранее определенные маршруты имеют приоритет над более поздними.из них.

6 голосов
/ 16 мая 2011

Боюсь, что такого простого способа не существует. Маршруты определены в lib/action_dispatch/routing/mapper.rb:271, что вызывает add_route для RouteSet (определено в rack-mount-0.6.14/lib/rack/mount/route_set.rb, а в строке 71 имя присоединено). Нет метода remove_route, и маршрут Engine добавляется последним. Вы можете добавить свой маршрут вручную после того, как приложение будет инициализировано с помощью Rails.application.routes.draw, вместо того, чтобы указывать его в route.rb, или вы можете исправить Engine.

4 голосов
/ 20 февраля 2013

Нет способа переопределить маршрут в двигателе.Вместо этого вы должны определить управляющий маршрут.Вы можете сделать это, вызвав prepend на маршрутизаторе движка:

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

Если пространство имен движка изолировано, для этого будет использоваться SomewhereController из пространства имен движка.Если нет, он будет использовать типичный SomewhereController.

. Если вы хотите переопределить маршрут, чтобы вернуть 404, лучший способ, который я могу придумать, это перенаправить на страницу 404:

match "/route_goes_here" => redirect("/404")
2 голосов
/ 11 марта 2013

Вы можете проложить маршруты, как предложено Райаном Бигом вышеЯ обнаружил, что для отмены именованного помощника по маршруту с моим пользовательским маршрутом мне нужно вызвать append вместо prepend, например так:

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

В противном случае приложение содержит как маршруты, так и именованного помощника дляМаршрутизатор двигателя является последним определением и, следовательно, тем, который применяется.

2 голосов
/ 17 мая 2011

Вам необходимо добавить хук инициализатора в 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 вашего движка, и вы можете переопределить их маршруты.

1 голос
/ 03 ноября 2016

Правила маршрутизации, определенные в routs.rb, применяются сверху вниз, пока не будет найдено совпадение.Мне удалось переопределить маршрут, определенный в установленном двигателе, просто переместив правило с более высоким приоритетом над линией, в которой установлен двигатель.Итак,

get 'about', controller: 'static', action: 'about', as: 'about'
mount My::Engine => '/'

приводит к тому, что приложение направляет / о / запросы (в данном случае) к статическому контроллеру, тогда как:

mount My::Engine => '/'
get 'about', controller: 'static', action: 'about', as: 'about'

приводит к тому, что приложение направляет / about / запросы на маршрут, определенный в смонтированном движке.

...