Rails 路由掩码
Rails route masking
我有一个 rails 应用程序,其中有一个用户页面。每个用户页面都是用户的仪表板,显示他的列表和他的活动。我也在使用来自设计的用户模型,所以我不能使用 user/:id
来引用用户,因为它用于注册和编辑密码等。
我添加了一条自定义路由如下:
match '/userpage', to: 'listings#userpage', via: :get
URL 看起来像:http://localhost:3000/userpage?id=2
我的问题是:
- 我希望 url 看起来像
http://localhost:3000/userpage/2
而无需创建单独的用户页面资源。我该如何处理?如果我添加 match '/userpage/:id', to: 'listings#userpage', via: :get
它不会给我路径的名称。我的意思是在 routes.I 中没有 userpage_path 可以访问,需要 userpage_path 在指向用户页面的链接中引用它。
- 我想显示用户名而不是 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 正在帮助您更轻松地做到这一点。
而且您不需要新模型。
我有一个 rails 应用程序,其中有一个用户页面。每个用户页面都是用户的仪表板,显示他的列表和他的活动。我也在使用来自设计的用户模型,所以我不能使用 user/:id
来引用用户,因为它用于注册和编辑密码等。
我添加了一条自定义路由如下:
match '/userpage', to: 'listings#userpage', via: :get
URL 看起来像:http://localhost:3000/userpage?id=2
我的问题是:
- 我希望 url 看起来像
http://localhost:3000/userpage/2
而无需创建单独的用户页面资源。我该如何处理?如果我添加match '/userpage/:id', to: 'listings#userpage', via: :get
它不会给我路径的名称。我的意思是在 routes.I 中没有 userpage_path 可以访问,需要 userpage_path 在指向用户页面的链接中引用它。 - 我想显示用户名而不是 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 正在帮助您更轻松地做到这一点。
而且您不需要新模型。