2012-03-22 9 views
7

me gustaría volver a dirigir un camino en las rutas usando las siguientes líneas:Acceso a ayudantes de URL en routes.rb

get 'privacy_policy', :controller => :pages, :as => 'privacy_policy' 
get 'privacypolicy.php' => redirect(privacy_policy_url) 

Para que /privacypolicy.php se le redirecciona a la página correcta definido justo encima de ella.

Sin embargo, se está lanzando el siguiente error:

undefined local variable or method `privacy_policy_url' 

Así que supongo que no se puede utilizar ayudantes de URL en routes.rb. ¿Hay alguna forma de utilizar URL helpers en el archivo de ruta y es aconsejable hacerlo?

Respuesta

4

Sé que' Estoy un poco tarde aquí, pero esta pregunta es uno de los principales éxitos cuando se busca en Google "use url_helpers en routes.rb", y al principio lo encontré cuando me encontré con este problema, así que me gustaría compartir mi solución.

Como @martinjlowm mencionó en su respuesta, uno no puede usar URL helpers cuando dibuja nuevas rutas. Sin embargo, hay es una forma de definir una regla de ruta de redirección utilizando ayudantes de URL. La cosa es, ActionDispatch::Routing::Redirection#redirect puede tomar un bloque (o una -able #call), que es más tarde (cuando el usuario pulsa la ruta) se invoca con dos parámetros, params y solicitud, para volver una nueva ruta, una cuerda. Y como las rutas se dibujaron correctamente en ese momento, ¡es completamente válido llamar a los ayudantes de URL dentro del bloque!

get 'privacypolicy.php', to: redirect { |_params, _request| 
    Rails.application.routes.url_helpers.privacy_policy_path 
} 

Además, podemos emplear instalaciones metaprogramación Ruby de añadir un poco de azúcar:

class UrlHelpersRedirector 
    def self.method_missing(method, *args, **kwargs) # rubocop:disable Style/MethodMissing 
    new(method, args, kwargs) 
    end 

    def initialize(url_helper, args, kwargs) 
    @url_helper = url_helper 
    @args = args 
    @kwargs = kwargs 
    end 

    def call(_params, _request) 
    url_helpers.public_send(@url_helper, *@args, **@kwargs) 
    end 

    private 

    def url_helpers 
    Rails.application.routes.url_helpers 
    end 
end 

# ... 

Rails.application.routes.draw do 
    get 'privacypolicy.php', to: redirect(UrlHelperRedirector.privacy_policy_path)  
end 
+0

¡Es una gran idea, me encanta, gracias! –

0

Algo así como:

get 'privacypolicy.php' => "privacy_policy#show" 
+0

Eso no es una redirección sin embargo, que es lo que quiero. Necesito que envíe un código 302. –

+0

puede devolver 302 como estado http: http://blog.futureshock-ed.com/http-status-code-symbols-for-rails render