2011-10-13 11 views
10

現在、私はユーザプロファイルを表示したいときに/ users/1 /のようなものを持っています。私はこの時点でRailsの問題に少し慣れていますが、routes.rbを使って/ user/chiggins/chigginsが一意のユーザー名に変更するにはどうすればいいですか?Rails IDと異なるものに基づくルート

ありがとうございます!

class User 
    def to_param 
    username 
    end 
end 

次にレールがルーティングのために自動的にそれを使用します:あなたが必要

答えて

13

は、Userモデル内のメソッドをオーバーライドすることto_paramです。お使いのコントローラで

match "https://stackoverflow.com/users/:username" => "users#show" 

、昔ながらのparams [:idは] [:名]のparamsになり、あなたが得ることができるhttp://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-i-to_param

+0

申し訳ありませんが、私は少し追加しましたが、次のエラーが表示されます: – Chiggins

+0

問題が見つかりませんでした。私のshowメソッドは "@user = User.find(:params [:id])"を実行していたので、ユーザ名で検索するように変更しました。 – Chiggins

+0

コントローラのコードを変更してください:User.find(params [:id])ではな​​くUser.find_first_by_username(params [:id])、to_paramの本文を "#{self.id} - #{self.username}"に変更してください –

0

最良の方法は、カスタムのparamでルートを定義することです参照してください。使用してデDBからユーザー:

User.find_by_username(params[:username]) 
+0

私はroutes.dbにその最初の行を追加しました:usernameまだ使用する必要があります:id – Chiggins

1

あなたが得ることができますごとのリソース識別子のcu Resourceインスタンスのmember_scopeメソッドとnested_scopeメソッドを再定義して、累積します。以下#nested_scopeについての質問については

resources :users do 
    @scope[:scope_level_resource].tap do |u| 
    def u.member_scope 
     "#{path}/:username" 
    end 

    def u.nested_scope 
     "#{path}/:#{singular}_username" 
     # member_scope also usable here, assuming username will be nowhere in nested routes. 
    end 
    end 
end 

resources :members do 
    resources :playlists, only: :index 
end 

その後、paramは次のようになります:ユーザ名:代わりにちょうどのmember_usernameを使用すると、ルーティングでこのような何かを行う場合に使用されます。これは、コレクションの組み立て時にプレイリストコントローラーで便利なので、要求の範囲を推測できます。

+0

私は "#{path} /:username"を理解して自動生成されたルートを上書きします。どのような意味 "nested_scope"メソッドを理解していない? – Matrix

+0

最新の回答を見る@Matrix。 – 20man

関連する問題