更改Rails路由中的id参数

时间:2010-05-14 19:44:05

标签: ruby-on-rails routing ruby-on-rails-3

使用Ruby on Rails 3的新路由系统,是否可以更改default:id参数

resources :users, :key => :username

提出以下路线

/users/new
/users/:username
/users/:username/edit
...etc

我在问,因为虽然上面的例子很简单,但在我正在处理的当前项目中做真的很有帮助。

是否可以更改此参数,如果没有,是否有特殊原因可以解决原因?

6 个答案:

答案 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