Rails 路由掩码

Rails route masking

我有一个 rails 应用程序,其中有一个用户页面。每个用户页面都是用户的仪表板,显示他的列表和他的活动。我也在使用来自设计的用户模型,所以我不能使用 user/:id 来引用用户,因为它用于注册和编辑密码等。

我添加了一条自定义路由如下:

match '/userpage', to: 'listings#userpage', via: :get

URL 看起来像:http://localhost:3000/userpage?id=2

我的问题是:

  1. 我希望 url 看起来像 http://localhost:3000/userpage/2 而无需创建单独的用户页面资源。我该如何处理?如果我添加 match '/userpage/:id', to: 'listings#userpage', via: :get 它不会给我路径的名称。我的意思是在 routes.I 中没有 userpage_path 可以访问,需要 userpage_path 在指向用户页面的链接中引用它。
  2. 我想显示用户名而不是 user_id。现在我将其显示为:http://localhost:3000/userpage?id=2&name=CoolShop,但我希望它显示为 http://localhost:3000/userpage/CoolShop。我知道 friendly_id gem 可以帮助我,但这需要一个用户页面模型。

请记住,用户页面只是一个用户页面,其中包含他的详细信息,而不是 devise 提供的注册详细信息,因此我不想为此创建一个单独的模型。

在路由文件 (routes.rb) 中你应该添加 resources :users 如果你还没有它,它会添加一个 user/:id 作为 user_path。 (以及 resources 通常使用的其他路线)

devise 没有任何与那个冲突的路由,这里是它添加的路由列表:(在 routes.rb 文件中使用 devise_for :users 时 - 它取决于您使用哪些模块)

#  # Session routes for Authenticatable (default)
#       new_user_session GET    /users/sign_in                    {controller:"devise/sessions", action:"new"}
#           user_session POST   /users/sign_in                    {controller:"devise/sessions", action:"create"}
#   destroy_user_session DELETE /users/sign_out                   {controller:"devise/sessions", action:"destroy"}
#
#  # Password routes for Recoverable, if User model has :recoverable configured
#      new_user_password GET    /users/password/new(.:format)     {controller:"devise/passwords", action:"new"}
#     edit_user_password GET    /users/password/edit(.:format)    {controller:"devise/passwords", action:"edit"}
#          user_password PUT    /users/password(.:format)         {controller:"devise/passwords", action:"update"}
#                        POST   /users/password(.:format)         {controller:"devise/passwords", action:"create"}
#
#  # Confirmation routes for Confirmable, if User model has :confirmable configured
#  new_user_confirmation GET    /users/confirmation/new(.:format) {controller:"devise/confirmations", action:"new"}
#      user_confirmation GET    /users/confirmation(.:format)     {controller:"devise/confirmations", action:"show"}
#                        POST   /users/confirmation(.:format)     {controller:"devise/confirmations", action:"create"}

关于路由命名:

您已经很好地添加了路由,但如果您想为其命名,您应该添加 as: "userpage" - 这将根据需要添加 userpage_path

get  '/userpage/:id', to: 'listings#userpage', as: "userpage"

match '/userpage/:id', to: 'listings#userpage', via: :get, as: "userpage"

关于在路由中使用用户名而不是用户 ID:

使用 friendly_id gem 是个好主意。

基本上,您向用户 table 添加一个名为 slug 的新字段(并在该字段上添加索引)-> 然后当用户注册时,您用用户名填充该 slug 字段. (做:username.parameterize 用破折号交换空格)

然后当有人要 /users/some-user-name 时,您可以使用 slug 字段而不是 id 字段进行查询。

User.where(slug: params[:id]) # will get user with slug: some-user-name

gem 正在帮助您更轻松地做到这一点。

而且您不需要新模型。