10

ヘルフレンズ

ユーザーの表示ページに user_id の代わりにユーザー名を表示したい。

例えば、

ハリーという名前のユーザーの usr_id 300 がデータベースに存在します。ではどうやって見せるか

http://localhost:3000/ハリー

それ以外の

http://localhost:3000/user/300

URLで。

これはルートファイル内で実行できますか?

ありがとう

4

3 に答える 3

15

これは一般にバニティ URL と呼ばれ、少し注意すれば非常に簡単に処理できます。初め...

  1. これがルートの最後のものであることを確認してください。ユーザー名が別のコントローラーの名前空間をオーバーライドすることは望ましくありません。
  2. 適切な除外リストを使用して、ユーザーが管理者、サポート、公式、セキュアなどのユーザー名を使用できないようにします。

あなたのルートで:

# the simple case
get '/:username' => 'users#show', :constrain => { :username => /[a-zA-Z-]+/ }

# ...with vanity_url_path(@user) helpers
get '/:username' => 'users#show', :as => 'vanity_url'

# or routing something more complicated with all the default resourceful routes
resources :users, :path => '/:username'

# or even just defining a bunch of routes for users with this format
controller :users, :path => '/:username' do
  get '/profile', :action => :profile    #=> /johnsmith/profile => UsersController#profile
end

:constrain上記のコードでは、わかりやすくするために各ルートのオプションを重複させないようにしています。ユーザー名に一致するように正規表現を調整してから、どのルートに行っても正規表現があることを確認してください。

これがアプリケーション内からユーザーにアクセスするデフォルトの方法になる場合 (つまり、ユーザーのプロファイルにアクセスするための便利な方法ではありません)、to_paramUsers モデルのメソッドをオーバーライドする必要があります。これにより、追加の引数を指定せずにurl_forヘルパーのようなものを使用できます。form_for @user

class User
  def to_param
    username
  end
end

もう 1 つの簡単なヒント: ルートをいじっていて、基本以外のことをしようとしている$ rake routes場合は、コマンド ラインから頻繁に呼び出して、Rails が現在認識しているルートを確認してください。不要なものをクリーンアップするのも良いことです。;)

于 2011-02-27T02:03:36.703 に答える
4

/:username が必要な場合は、routes.rb ファイルでこれを試してください (これはブロックの最後の行にする必要があります! - 最後のルートが作成されました!)

match "/:id", :to => "users#show", :as => :friendly_user

次に、それを少しでも軽減するために、make_permalink gemを使用してわかりやすい URL 名を簡単に作成し、モデルの to_param メソッドをオーバーライドできます。

# models/user.rb
make_permalink :username    

def to_param
  permalink
end

さらに良くするために、 User.find メソッドをオーバーライドして、パーマリンクまたは ID で機能するようにします。

def self.find(query)
  self.find_by_username(query) || super(query)
end

これは、User.find(1) または User.find(my_username) で機能します。

それが役立つことを願って、

ニコラス・ホック・イサザ

于 2011-02-27T01:53:59.480 に答える
0

routes.rb でこのようなことを試してください

map.user_permalink 'users/:user_name', :controller => 'users', :action => 'show'

後でビューで次のように使用します。

<%= link_to user.name, user_permalink_path(user.user_name.parameterize) %>

コードを貼り付けるだけで機能するかどうかはわかりませんが、要点はわかります:)

于 2011-02-27T01:43:14.070 に答える