2

ユーザーのURLを次のようにしたい場合

http://site.com/foobar 

それ以外の

http://site.com/users/foobar

foobarnicknameユーザーモデルの列からのユーザーのニックネームになります。ユーザーが最上位ルートを登録できないようにするにはどうすればよいですか? 連絡先、概要、ログアウトなど?

予約済みの名前のテーブルを持つことができます。したがって、ユーザーがニックネームを登録すると、このテーブルと照合されます。しかし、より便利なアプローチはありますか?

4

1 に答える 1

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:

いずれかのパスがによって認識されているように見える場合は、次の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]

于 2012-04-12T19:26:54.940 に答える