ヘルフレンズ
ユーザーの表示ページに user_id の代わりにユーザー名を表示したい。
例えば、
ハリーという名前のユーザーの usr_id 300 がデータベースに存在します。ではどうやって見せるか
それ以外の
URLで。
これはルートファイル内で実行できますか?
ありがとう
ヘルフレンズ
ユーザーの表示ページに user_id の代わりにユーザー名を表示したい。
例えば、
ハリーという名前のユーザーの usr_id 300 がデータベースに存在します。ではどうやって見せるか
それ以外の
URLで。
これはルートファイル内で実行できますか?
ありがとう
これは一般にバニティ URL と呼ばれ、少し注意すれば非常に簡単に処理できます。初め...
あなたのルートで:
# 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 が現在認識しているルートを確認してください。不要なものをクリーンアップするのも良いことです。;)
/: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) で機能します。
それが役立つことを願って、
ニコラス・ホック・イサザ
routes.rb でこのようなことを試してください
map.user_permalink 'users/:user_name', :controller => 'users', :action => 'show'
後でビューで次のように使用します。
<%= link_to user.name, user_permalink_path(user.user_name.parameterize) %>
コードを貼り付けるだけで機能するかどうかはわかりませんが、要点はわかります:)