2012-03-22 13 views
7

Vorrei reindirizzare un percorso in percorsi utilizzando le seguenti righe:Accesso aiutanti URL in routes.rb

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

In modo che /privacypolicy.php viene reindirizzato alla pagina corretta definita destra sopra di esso.

Tuttavia, è gettando il seguente errore:

undefined local variable or method `privacy_policy_url' 

Quindi immagino che non si può utilizzare gli helper URL in routes.rb. C'è un modo per utilizzare gli helper URL nel file di percorso ed è consigliabile farlo?

risposta

4

so' C'è un po 'tardi qui, ma questa domanda è uno dei migliori successi quando su Google "usa url_helpers in routes.rb" e inizialmente l'ho trovato quando mi sono imbattuto in questo problema, quindi mi piacerebbe condividere la mia soluzione.

Come @martinjlowm menzionato nella sua risposta, non è possibile utilizzare gli helper URL quando disegno nuove route. Tuttavia, lo è un modo per definire una regola di reindirizzamento della route utilizzando gli helper URL. Il fatto è che, ActionDispatch::Routing::Redirection#redirect può prendere un blocco (o un #call -able), che è poi (quando l'utente preme il percorso) invocato con due parametri, params e richiesta, per restituire un nuovo percorso, un stringa. E poiché i percorsi sono disegnati correttamente in quel momento, è completamente valido chiamare gli helper URL all'interno del blocco!

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

Inoltre, siamo in grado di impiegare Rubino strutture metaprogrammazione di aggiungere po 'di zucchero:

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

Questa è una grande idea, lo adoro, grazie! –

0

Qualcosa di simile:

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

Questo non è un reindirizzamento tuttavia, che è quello che voglio. Mi serve per inviare un codice 302. –

+0

è possibile restituire 302 come stato http: http://blog.futureshock-ed.com/http-status-code-symbols-for-rails rendering