因此,當我想查看用戶配置文件時,我有類似/ users/1 /的內容。不知道這是多麼容易或常見的問題,在這一點上我是一個Rails noob,但是我怎麼能通過routes.rb將其改爲/ user/chiggins/chiggins是一個唯一的用戶名?Rails路由基於不同於ID的東西
非常感謝!
因此,當我想查看用戶配置文件時,我有類似/ users/1 /的內容。不知道這是多麼容易或常見的問題,在這一點上我是一個Rails noob,但是我怎麼能通過routes.rb將其改爲/ user/chiggins/chiggins是一個唯一的用戶名?Rails路由基於不同於ID的東西
非常感謝!
你需要的是覆蓋to_param方法在用戶模式:
class User
def to_param
username
end
end
然後軌將自動地使用它的路由。見http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-i-to_param
最好的方法是定義一個自定義PARAM路線:
match "https://stackoverflow.com/users/:username" => "users#show"
在你的控制器,普通的老PARAMS [:ID]將PARAMS [:用戶名],你可以得到使用來自德DB用戶:
User.find_by_username(params[:username])
我剛剛添加了第一行到我的routes.db,雖然沒有使用:用戶名我仍然需要使用:id – Chiggins
另一種可能考慮將是friendly_id寶石 - https://github.com/norman/friendly_id
你可以得到每個資源標識符立方米通過重新定義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而不只是:用戶名,當你做這樣的事情在路由它被使用。在彙編集合時,這在播放列表控制器中非常有用,因此您可以推斷出請求的範圍。
現在在資源聲明上有一個:param
的論點。 http://guides.rubyonrails.org/routing.html#overriding-named-route-parameters
好吧,我加了一點點,但我得到以下錯誤:http://chigstuff.com/uploads/user_error.jpg – Chiggins
沒關係,我發現我的問題。我的顯示方法是「@user = User.find(:params [:id])」,我改變它以搜索用戶名。 – Chiggins
更改控制器中的代碼:not User.find(params [:id])but User.find_first_by_username(params [:id])或將to_param的主體更改爲「#{self.id} - #{self.username}」 –