在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