使用Ruby on Rails 3的新路由系统,是否可以更改default:id参数
resources :users, :key => :username
提出以下路线
/users/new
/users/:username
/users/:username/edit
...etc
我在问,因为虽然上面的例子很简单,但在我正在处理的当前项目中做真的很有帮助。
是否可以更改此参数,如果没有,是否有特殊原因可以解决原因?
答案 0 :(得分:64)
在您的路线中,您可以使用
resources :user, param: :username
答案 1 :(得分:35)
如果我理解正确,您想要的是在您的网址中设置username
而不是id
,对吗?
您可以通过覆盖模型中的to_param
方法来实现。您可以获得更多信息here。
答案 2 :(得分:26)
对于Ruby on Rails 4.1.4(可能还有早期版本),你需要做 j..和Ujjwal建议:
1)在config/routes.rb
中,添加:
resources :user, param: :username
2)在app/models/user.rb
中,添加:
def to_param
username
end
在你只做#1然后你的所有路线都是正确的,从rake routes
可以看出:
$ rake routes
Prefix Verb URI Pattern Controller#Action
user_index GET /user(.:format) user#index
POST /user(.:format) user#create
new_user GET /user/new(.:format) user#new
edit_user GET /user/:username/edit(.:format) user#edit
user GET /user/:username(.:format) user#show
PATCH /user/:username(.:format) user#update
PUT /user/:username(.:format) user#update
DELETE /user/:username(.:format) user#destroy
然而,基于User
实例构建网址的辅助方法仍然会在网址中包含id
,例如/user/1
。要在构建的网址中获取username
,您需要覆盖{2}中的to_param
。
答案 3 :(得分:1)
尽管答案已被提问者接受,但有一种简单的方法可以做到这一点。将此代码写入控制器。
authorize_resource :find_by => :username
并在您的视图中,您要显示链接的位置,请编写此代码。
<%= link_to "Username", user_path(u.username) %>
您的路线或控制器不需要任何其他更改。
更新:只有在使用CanCan gem时才会有效。
答案 4 :(得分:1)
FriendlyId宝石可以帮助你解决这个问题。 Ryan Bates对使用这个宝石有很好的video tutorial。
答案 5 :(得分:0)
将用户名作为路径助手的输入。
在您的观看代码中:
user_path(u.username) #/users/john
在您的控制器中,将收到的id
视为username
:
def show
user = User.find_by_username!(params[:id])
...
end