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:
いずれかのパスがによって認識されているように見える場合は、次のrecognize_path
ようなものがあります。
get ':nick' => 'user#show'
あなたの終わりに、routes.rb
それはどんな道もルーティング可能である状況につながります。これを修正するには、制約を使用する必要があります。例を示します。
# 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
このようにして、ルーティングシステムに動的な要素を追加します。ニックネームのあるユーザーがいる場合はjdoe
、ルート/jdoe
が認識されます。パスrroe
よりもニックネームのあるユーザーがいない場合は、ルーティングできません。/rroe
しかし、もし私があなたなら、私は単に2つのことをするでしょう:
# in User.rb
def to_param
nick
end
# in routing.rb
resources :users, path: 'u'
そしてそれは私にのようなパスを取得する能力を与えてくれます/u/jdoe
(これは非常にシンプルでRESTに完全に準拠しています)。
この場合、を介してユーザーを検索していることを確認してください(残念ながら、タイトルは含まれていますが、User.find_by_nick! params[:id]
まだ検索されています)。params[:id]