在Rails路由中更改id参数
使用Ruby on Rails 3的新路由系统,是否可以更改默认:id参数
resources :users, :key => :username
出来以下路线
/users/new /users/:username /users/:username/edit ...etc
我在问,因为虽然上面的例子很简单,但是在我正在进行的一个当前项目中,这样做确实很有帮助。
有没有可能改变这个参数,如果没有,是否有一个特别的原因,为什么不呢?
如果我正确地理解你,你想要的是在你的url有用username
而不是id
,对吗?
你可以通过覆盖模型中的to_param
方法来做到这一点。 你可以在这里获得更多的信息。
在你的路线上,你可以使用
resources :user, param: :username
对于Ruby on Rails 4.1.4(以及可能更早的版本),你需要做的事情和Ujjwalbuild议:
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
实例的url的helper方法仍然会在url中包含id
,例如/user/1
。 要获取构build的url中的username
,您需要覆盖#2中的to_param
。
虽然答案已经被提问者所接受,但有一个简单的方法来做到这一点。 把这个代码写在你的控制器里。
authorize_resource :find_by => :username
在你看来,你想要显示的链接,写这个代码。
<%= link_to "Username", user_path(u.username) %>
您的路线或控制器不需要任何其他更改。
更新:这将只适用于如果你使用CanCan的gem。
FriendlyIdgem可以帮助你。 瑞安贝茨有一个很好的使用这个gemvideo教程 。
将用户名作为input传递给path助手。
在您的视图代码中:
user_path(u.username) #/users/john
在你的控制器中把收到的username
作为username
:
def show user = User.find_by_username!(params[:id]) ... end