将另一个属性传递给 id 以外的参数

Passing another attribute to params other than the id

我想使用 params[:username].

params 访问我的 User 模型的 username 属性

在我的 user 模型上,我有

class User < ApplicationRecord
  has_secure_password

  validates :email, presence: true, uniqueness: { case_sensitive: false }
  validates :username, presence: true, uniqueness: { case_sensitive: false }
  validates :password, length: { minimum: 6 }, on: :create

  def to_params
    username
  end
end

config/routes.rb 期间,我有:

Rails.application.routes.draw do
  root "pages#home"

  resources :users, path: "/", except: :index
end

这部分满足了我的要求。

产生的路线如下:

     Prefix Verb   URI Pattern         Controller#Action
       root GET    /                   pages#home
      users POST   /                   users#create
   new_user GET    /new(.:format)      users#new
  edit_user GET    /:id/edit(.:format) users#edit
       user GET    /:id(.:format)      users#show
            PATCH  /:id(.:format)      users#update
            PUT    /:id(.:format)      users#update
            DELETE /:id(.:format)      users#destroy

其中 :id 部分输出 Userusername ,因此我在访问用户主页时得到类似 /jim 的路由。

让我烦恼的是我在访问控制器上的 username 时必须使用 params[:id]。此外,当我像这样嵌套资源时:

  resources :users do
    resources :posts
  end

我得到一条类似 /users/:user_id/posts(.:format) 的路线,其中 :user_idusername

有什么方法可以设置它,使我的路线看起来像:

     Prefix Verb   URI Pattern                Controller#Action
       root GET    /                          pages#home
      users POST   /                          users#create
   new_user GET    /new(.:format)             users#new
  edit_user GET    /:username/edit(.:format)  users#edit
       user GET    /:username(.:format)       users#show
            PATCH  /:username(.:format)       users#update
            PUT    /:username(.:format)       users#update
            DELETE /:username(.:format)       users#destroy

当我想从 params 访问 username 时,我可以写 params[:username]?

谢谢!

有关详细信息,请查看 rails 指南 overriding-named-route-parameters

像这样添加路线

Rails.application.routes.draw do
  root "pages#home"

  resources :users, path: "/", except: :index, param: :username do
     resources :posts
  end
end