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).
'Verbieten 'tritt jedes Mal auf ... –
Überprüfen Sie meine UPD in der Antwort. – jdoe