在 rails 中将路由 URL 从随机 :id 更改为 :username

change routes URL from a random :id to :username in rails

我想以某种方式更改我的 routes.rb 文件,以便它更改我当前的网址

 localhost:3000/amitian/1

到localhost:3000/用户名

我会提供我的routes.rb文件以供参考

  Rails.application.routes.draw do

 devise_for :amitians

 root 'home#index'
 resources :amitians do
 member do
 get :following, :followers
 end
end
 resources :confessions do
member do
    get 'like' , to: 'confessions#upvote'
    get 'dislike' , to: 'confessions#downvote'
    end
    resources :confessioncomments
  end
    resources :relationships, only: [:create, :destroy]

 end

在rails4中你可以在route

中进行以下操作
resources :amitians, param: :username

如 Gregg 所述,您可以使用以下方法更改参数名称:

resources :amitians, param: :username

但实际上您只是在重命名一个变量。在控制器操作 amitians#show:

中确定您需要 ID 还是用户名
@amitian = Amitian.find(param[:id]) # Treat :id as id
@amitian = Amitian.find_by_username(param[:id]) # Treat :id as username

现在,如果您想专门路由到 /:username 而不是 /amitians/:username,则必须覆盖该资源路由:

resources :amitians, except: [:show] do
  member do
    get :following, :followers
  end
end
get '/:username', to: 'amitians#show'

但是,我不建议这样做。当用户输入不正确的 url 并获得用户页面而不是 404 错误时,将参数直接设置为 root 会导致很多混乱。或者更糟糕的是,如果用户选择用户名 'login' 或 'register' 怎么办?要么无法访问您的注册页面,要么无法访问该用户的页面。

我还应该指出 rails 便利方法,例如 resourcesAmitian.findurl_for @amitianlink_to @amitian 等都使用 REST 标准使用数字 ID。

如果您想使用用户名而不是 ID,除了路由文件之外,您还必须停止依赖这些方法并更改您的控制器和视图。