更改Rails路由中的id参数

joe*_*lis 40 routing ruby-on-rails ruby-on-rails-3

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

resources :users, :key => :username
Run Code Online (Sandbox Code Playgroud)

出来以下路线

/users/new
/users/:username
/users/:username/edit
...etc
Run Code Online (Sandbox Code Playgroud)

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

是否可以更改此参数,如果没有,是否有特定原因为什么不?

小智 64

在您的路线中,您可以使用

resources :user, param: :username
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案,我更愿意在路由中添加参数而不是覆盖`to_param`方法 (4认同)
  • 这在Rails 4.0.4中对我不起作用. (3认同)

Ju *_*ira 35

如果我理解正确,你想要的是拥有username而不是id你的网址,对吧?

您可以通过覆盖to_param模型中的方法来实现.您可以在此处获取更多信息.


Mat*_*att 26

对于Ruby on Rails的4.1.4(甚至更早的版本),你需要做什么 Ĵ..Ujjwal建议:

1)在config/routes.rb,添加:

resources :user, param: :username
Run Code Online (Sandbox Code Playgroud)

2)在app/models/user.rb,添加:

def to_param
  username
end
Run Code Online (Sandbox Code Playgroud)

在你只做#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
Run Code Online (Sandbox Code Playgroud)

然而,基于User实例构造url的辅助方法仍然包括idurl中的url,例如/user/1.要获得username构建的URL,您需要覆盖to_param#2中的内容.

  • 当这个问题出现时,2)大部分时间错过了; 这应该是公认的答案 (4认同)