ruby-on-rails - link_to - collection do rails routes



Supprimer les itinéraires spécifiés dans un Gem? (2)

Il est possible d'empêcher Rails de charger les routes d'une gemme spécifique, de cette façon aucune des routes gemme n'est ajoutée, vous devrez donc ajouter celles que vous voulez manuellement:

Ajoutez un initialiseur dans application.rb comme ceci:

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

https://ffff65535.com

Existe-t-il un moyen de supprimer les itinéraires spécifiés dans une gemme dans Rails 3? La mémoire d'exception gem spécifie les routes que je ne veux pas. J'ai besoin de spécifier des contraintes sur les routes comme ceci:

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

Basé sur les docs de Rails Engine , j'ai pensé que je pourrais créer un patch de singe et ajouter un fichier de routes sans chemins spécifiés aux chemins ["config / routes"]. Paths Array mais le fichier n'est pas ajouté à ExceptionLogger :: Engine .paths ["config / routes"].

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")))

Suis-je loin de la base ici? Peut-être qu'il y a une meilleure façon de faire cela?


Voici une façon qui a fonctionné pour moi.

Il ne "supprime" pas les routes mais vous permet de prendre le contrôle de l'endroit où elles correspondent. Vous voulez probablement que chaque route demandée corresponde à quelque chose, même si c'est un 404 tout en bas.

Vos routes d'application (MyApp / config / routes.rb) seront chargées en premier (sauf si vous avez modifié le processus de chargement par défaut). Et les routes correspondant en premier auront la priorité.

Vous pouvez donc redéfinir les routes que vous souhaitez bloquer explicitement ou les bloquer en saisissant toutes les routes au bas du fichier YourApp / config / routes.rb.

Les routes nommées, malheureusement, semblent suivre la règle de "la dernière définition gagne" de Ruby. Ainsi, si les routes sont nommées et que votre application ou le moteur utilise ces noms, vous devez d'abord définir les routes (donc la vôtre correspond en premier) et la dernière (les routes nommées pointent comme vous le vouliez).

Pour redéfinir les routes du moteur après que le moteur les ait ajoutées, créez un fichier appelé quelque chose comme

# 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

Vous pouvez tester ce sandwich de routage dans la console:

> 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.

Après votre correction, ces appels doivent correspondre les uns aux autres.

(Je l'ai posté à l'origine sur le groupe google de la raffinerie gem ici: https://groups.google.com/forum/?fromgroups#!topic/refinery-cms/N5F-Insm9co )





override