我有一个rails应用,我有一个用户页面。每个用户页面都是用户的仪表板,显示他的列表和他的活动。我也使用来自设计的用户模型,所以我不能使用user/:id
来引用用户,因为它用于注册和编辑密码等。
我添加了一条自定义路线,如下所示:
match '/userpage', to: 'listings#userpage', via: :get
网址如下:http://localhost:3000/userpage?id=2
我的问题是:
http://localhost:3000/userpage/2
而不创建单独的用户页面资源。我该怎么办呢?如果我添加match '/userpage/:id', to: 'listings#userpage', via: :get
它没有给我路径的名称。我的意思是在route.I中没有userpage_path可以访问。我需要userpage_path在链接到用户页面时引用它。http://localhost:3000/userpage?id=2&name=CoolShop
但我希望它为http://localhost:3000/userpage/CoolShop
。我知道friendly_id gem可以帮助我,但这需要一个用户页面模型。 请注意,用户页面只是一个用户页面,其详细信息不是设计提供的注册详细信息,因此我不想为此创建单独的模型。
答案 0 :(得分:2)
在路线文件(routes.rb
)中,如果您还没有添加resources :users
,则会添加user/:id
作为user_path
。 (以及resources
通常做的其余路线)
devise没有任何与该路由冲突的路由,这里是它添加的路由列表:(在devise_for :users
文件中使用routes.rb
时 - 它取决于哪些模块你用)
# # 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是个好主意。
基本上,您向名为slug
的用户表添加一个新字段(并在该字段上添加索引) - >然后当用户注册时,用用户名填充该slug字段。 (执行:username.parameterize
用空格交换空格)
然后,如果有人要使用/ users / some-user-name,您可以使用slug字段而不是id字段进行查询。
User.where(slug: params[:id]) # will get user with slug: some-user-name
宝石正在帮助你轻松做到这一点。
并且您不需要新模型。