Удалить маршруты, указанные в жемчужине? - PullRequest
7 голосов
/ 05 мая 2011

Есть ли способ удалить маршруты, указанные в геме в Rails 3?Исключительный журнал gem указывает маршруты, которые я не хочу.Мне нужно указать ограничения на маршруты следующим образом:

scope :constraints => {:subdomain => 'secure',  :protocol => 'https'} do 
    collection do
        post :query
        post :destroy_all
        get :feed
    end
end

Основываясь на документации Rails Engine , я подумал, что мог бы создать патч обезьяны и добавить файл маршрутов без указания маршрутовк путям ["config / маршруты"]. path Массив, но файл не добавляется в ExceptionLogger :: Engine.paths ["config / маршруты"]. пути

File: config/initializers/exception_logger_hacks.rb

ExceptionLogger::Engine.paths["config/routes"].paths.unshift(File.expand_path(File.join(File.dirname(__FILE__), "exception_logger_routes.rb")))

Я не в путибаза здесь?Может быть, есть лучший способ сделать это?

Ответы [ 2 ]

9 голосов
/ 01 сентября 2012

Можно запретить Rails загружать маршруты определенного драгоценного камня, таким образом, ни один из маршрутов драгоценного камня не добавляется, поэтому вам придется добавить те, которые вы хотите вручную:

Добавьте инициализатор в application.rb следующим образом:

class Application < Rails::Application
...
initializer "myinitializer", :after => "add_routing_paths" do |app|
  app.routes_reloader.paths.delete_if{ |path| path.include?("NAME_OF_GEM_GOES_HERE") }
end
2 голосов
/ 05 мая 2011

Вот один способ, который сработал для меня.

Он не «удаляет» маршруты, но позволяет вам контролировать их соответствие.Вы, вероятно, хотите, чтобы каждый запрашиваемый маршрут соответствовал чему-либо, даже если в нижней части находятся все 404.

Сначала будут загружены маршруты вашего приложения (MyApp / config / rout.rb) (если вы не изменилипроцесс загрузки по умолчанию).И маршруты, соответствующие первому, будут иметь приоритет.

Таким образом, вы можете переопределить маршруты, которые вы хотите явно заблокировать, или заблокировать их с помощью перехвата всех маршрутов внизу файла YourApp / config / rout.rb.

Именованные маршруты, к сожалению,похоже, следуют правилу ruby ​​«последнее определение выигрывает».Поэтому, если маршруты названы, и ваше приложение или механизм использует эти имена, вам нужно определить маршруты как первым (так, чтобы ваш соответствовал первому), так и последним (так называемые маршруты указывают так, как вы предполагали, а не так, как определяет механизм.)

Чтобы переопределить маршруты движка после их добавления, создайте файл с именем что-то вроде

# config/named_routes_overrides.rb
Rails.application.routes.draw do
  # put your named routes here, which you also included in config/routes.rb
end

# config/application.rb
class Application < Rails::Application
  # ...

  initializer 'add named route overrides' do |app|
    app.routes_reloader.paths << File.expand_path('../named_routes_overrides.rb',__FILE__) 
    # this seems to cause these extra routes to be loaded last, so they will define named routes last.
  end
end

. Вы можете проверить этот бутерброд маршрутизации в консоли:

> Rails.application.routes.url_helpers.my_named_route_path
=> # before your fix, this will be the engine's named route, since it was defined last.

> Rails.application.routes.recognize_path("/route/you/want/to/stop/gem/from/controlling")
=> # before your fix, this will route to the controller and method you defined, rather than what the engine defined, because your route comes first.

После вашего исправления эти вызовы должны совпадать.

(я изначально разместил это в google группе по переработке драгоценных камней здесь: https://groups.google.com/forum/?fromgroups#!topic/refinery-cms/N5F-Insm9co)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...