2013-10-28 14 views
6

Voglio reindirizzare a un URL diverso quando il vincolo percorso fallisceRiorientare dalle rotte in cui i vincoli non riescono

Route.rb

partita '/ u' => 'utente # signin',: vincoli = > BlacklistDomain

blacklist_domain.rb

class BlacklistDomain 
    BANNED_DOMAINS = ['domain1.com', 'domain2.com'] 

    def matches?(request) 
     if BANNED_DOMAINS.include?(request.host) 
      ## I WANT TO REDIRECT HERE WHEN THE CONDITION FAILS 
      else 
        return true  
      end 

    end 
end 
+0

Avete avuto fortuna con questo? – zeantsoi

+0

Sì, grazie zeantsoi. La tua strada ha funzionato. Speravo se ci fosse un modo diretto per gestirlo nei punti di contatto. – Ross

risposta

7

Perché percorsi Rails vengono eseguite in modo sequenziale, è possibile simulare login condizionale nel modo seguente:

# config/routes.rb 
match '/u' => 'controller#action', :constraints => BlacklistDomain.new 
match '/u' => 'user#signin' 

La prima riga controlla se le condizioni del vincolo sono soddisfatte (vale a dire, se la richiesta proviene da un dominio nella lista nera). Se il vincolo è soddisfatto, la richiesta viene instradata a controller#action (sostituire di conseguenza, ovviamente).

Se le condizioni di vincolo sicuro da soddisfare (cioè, la richiesta non è nella lista nera), la richiesta verrà instradata user#signing.

Perché questa logica condizionale è effettivamente gestita nei vostri percorsi, il codice di vincoli può essere semplificata:

# blacklist_domain.rb 
class BlacklistDomain 
    BANNED_DOMAINS = ['domain1.com', 'domain2.com'] 

    def matches?(request) 
    if BANNED_DOMAINS.include?(request.host) 
     return true  
    end 
    end 
end