将路由URL从random:id更改为:rails中的用户名

时间:2017-02-01 17:34:17

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 rubygems

我想以某种方式更改我的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

2 个答案:

答案 0 :(得分:3)

正如Gregg所说,您可以使用以下命令更改参数名称:

resources :amitians, param: :username

但你基本上只是重命名一个变量。是否期望id或用户名是在控制器动作amitians#show:

中确定的
@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参数会给您带来很多困惑。或者更糟糕的是,如果用户选择用户名“登录”或“注册”怎么办?您的注册页面将无法访问,或者该用户的页面将无法访问。

我还应该指出,诸如resourcesAmitian.findurl_for @amitianlink_to @amitian之类的rails便捷方法都使用了使用数字ID的REST标准。< / p>

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

答案 1 :(得分:0)

在rails 4中,您可以在路径中执行以下操作

resources :amitians, param: :username