2011-05-05 15 views
6

¿Hay alguna manera de eliminar las rutas especificadas en una gema en Rails 3? La herramienta de registro de excepción especifica rutas que no quiero. Necesito especificar restricciones en las rutas de este modo:Eliminar rutas especificadas en una gema?

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

Sobre la base de la Rails Engine docs, pensé que podría crear un parche mono y añadir un archivo de rutas sin rutas especificadas a los caminos [ "config/rutas"] .paths matriz pero el archivo no se añaden a ExceptionLogger :: Engine.paths [ "config/rutas"].

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

¿Estoy fuera de lugar aquí? Tal vez hay una mejor manera de hacer esto?

Respuesta

7

Es posible prevenir los carriles de carga de las rutas de una joya específica, se añaden de esta manera ninguna de las rutas de la gema, por lo que tendrá que añadir las que desee de forma manual:

añadir un inicializador en application.rb así:

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 
+0

Me gusta esta solución elegante. Trabaja bien con las páginas de administración de _role. –

+0

Probablemente también usaré este enfoque en el futuro, en lugar del enfoque que describí anteriormente. ¡Gracias! –

+0

¡Solución dulce! ¡Gracias! – EDD

2

Aquí hay una manera que me funcionó.

No "elimina" las rutas, pero le permite controlar dónde coinciden. Es probable que desee que cada ruta solicitada coincida con algo, incluso si se trata de una captura de 404 en la parte inferior.

Sus rutas de aplicación (MyApp/config/routes.rb) se cargarán primero (a menos que haya modificado el proceso de carga predeterminado). Y las rutas que coincidan primero tendrán prioridad.

Para que pueda redefinir las rutas que desea bloquear explícitamente, o bloquearlas con una ruta catch all en la parte inferior del archivo YourApp/config/routes.rb.

Las rutas con nombre, lamentablemente, parecen seguir la regla de "última definición gana" de ruby. Entonces, si las rutas son nombradas y su aplicación o el motor usa esos nombres, necesita definir primero las rutas (por lo tanto, la suya es la primera) y la última (las rutas denominadas apuntan como usted lo pensó, no como lo define el motor)

Para redefinir rutas del motor cuando el motor se les añade, cree un archivo llamado algo así como

# 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 

usted puede probar este sándwich de enrutamiento en la consola:

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

después de su revisión, estas llamadas deben coincidir entre sí.

(I publicado esto originalmente en el grupo joya Google refinería aquí: https://groups.google.com/forum/?fromgroups#!topic/refinery-cms/N5F-Insm9co)

+2

Gracias por la respuesta. Creo que por ahora, lo más fácil de hacer que es un truco es hacer algo como esto: match "/ logged_exceptions" => redirigir ("/ 404.html") coincidencia "/ logged_exceptions/* other" => redirigir ("/ 404.html") que descarta las rutas de la gema y las nuevas rutas tienen un alcance como secure.mydomain.com/secure/logged_exceptions. – EDD

Cuestiones relacionadas