2012-04-12 6 views
3

Profil Urls verhindern Wenn ich wieWie kollidiert mit anderen Routen

http://site.com/foobar 

statt

http://site.com/users/foobar 

foobar wäre der Spitzname eines Benutzers aus der nickname Spalte suchen Benutzer Urls wollte das Benutzermodell. Wie verhindere ich, dass Benutzer Routen auf höchster Ebene registrieren? Wie Kontakt, Abmelden, usw.?

Ich kann eine Tabelle mit reservierten Namen haben. Wenn ein Benutzer einen Spitznamen registriert, würde er diese Tabelle überprüfen. Aber gibt es einen bequemeren Ansatz?

Antwort

1
if(Rails.application.routes.recognize_path('nickname') rescue nil) 
    # forbid using desired nickname 
else 
    # nickname can be used -- no collisions with existing paths 
end 

UPD:

Wenn scheint jeder Weg durch die recognize_path erkannt werden dann haben Sie, so etwas wie:

get ':nick' => 'user#show' 

am Ende Ihres routes.rb, die mit den Leitungen Situation, in der jeder Pfad routingfähig sein kann. Um dies zu beheben, müssen Sie Constraints verwenden. Ich werde Ihnen ein Beispiel:

# in routes.rb 
class NickMustExistConstraint 
    def self.matches?(req) 
     req.original_url =~ %r[//.*?/(.*)] # finds jdoe in http://site.com/jdoe. You have to look at this regexp, but you got the idea. 
     User.find_by_nick $1 
    end 
end 
get ':nick' => 'users#show', constraints: NickMustExistConstraint 

So können wir einige dynamische in unser Routing-System setzen, und wenn wir einen Benutzer mit nick haben jdoe dann Route /jdoe erkannt. Wenn wir keinen Benutzer mit dem Nick rroe als /rroe haben, wird der Pfad nicht durchführbar sein.

ABER, wenn ich Sie wäre, würde ich einfach zwei Dinge tun:

# in User.rb 
def to_param 
    nick 
end 
# in routing.rb 
resources :users, path: 'u' 

Und es wird die Möglichkeit geben, mich Pfade wie ein /u/jdoe zu bekommen (was ganz einfach und völlig mit REST entsprechen) .

In diesem Fall stellen Sie sicher, dass Sie Ihre Benutzer über User.find_by_nick! params[:id] (ja, es ist immer noch params[:id], obwohl enthält einen Titel, leider).

+0

'Verbieten 'tritt jedes Mal auf ... –

+0

Überprüfen Sie meine UPD in der Antwort. – jdoe

Verwandte Themen