2011-10-13 67 views
10

因此,當我想查看用戶配置文件時,我有類似/ users/1 /的內容。不知道這是多麼容易或常見的問題,在這一點上我是一個Rails noob,但是我怎麼能通過routes.rb將其改爲/ user/chiggins/chiggins是一個唯一的用戶名?Rails路由基於不同於ID的東西

非常感謝!

回答

13

你需要的是覆蓋to_param方法在用戶模式:

class User 
    def to_param 
    username 
    end 
end 

然後軌將自動地使用它的路由。見http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-i-to_param

+0

好吧,我加了一點點,但我得到以下錯誤:http://chigstuff.com/uploads/user_error.jpg – Chiggins

+0

沒關係,我發現我的問題。我的顯示方法是「@user = User.find(:params [:id])」,我改變它以搜索用戶名。 – Chiggins

+0

更改控制器中的代碼:not User.find(params [:id])but User.find_first_by_username(params [:id])或將to_param的主體更改爲「#{self.id} - #{self.username}」 –

0

最好的方法是定義一個自定義PARAM路線:

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

在你的控制器,普通的老PARAMS [:ID]將PARAMS [:用戶名],你可以得到使用來自德DB用戶:

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

我剛剛添加了第一行到我的routes.db,雖然沒有使用:用戶名我仍然需要使用:id – Chiggins

1

你可以得到每個資源標識符立方米通過重新定義Resource實例上的member_scope和nested_scope方法來實現stomization。

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 

至於下面關於#nested_scope問題:

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

然後,帕拉姆將是::member_username而不只是:用戶名,當你做這樣的事情在路由它被使用。在彙編集合時,這在播放列表控制器中非常有用,因此您可以推斷出請求的範圍。

+0

我明白「#{path} /:username」,以覆蓋自動生成的路線,但我不會不明白「nested_scope」方法是什麼意思? – Matrix

+0

查看更新的答案@Matrix。 – 20man