Rails路由掩蔽

时间:2018-02-19 00:21:38

标签: ruby-on-rails ruby-on-rails-4 activerecord routes friendly-id

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

我添加了一条自定义路线,如下所示:

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

网址如下:http://localhost:3000/userpage?id=2

我的问题是:

  1. 我希望网址看起来像http://localhost:3000/userpage/2而不创建单独的用户页面资源。我该怎么办呢?如果我添加match '/userpage/:id', to: 'listings#userpage', via: :get它没有给我路径的名称。我的意思是在route.I中没有userpage_path可以访问。我需要userpage_path在链接到用户页面时引用它。
  2. 我想显示用户名而不是user_id。现在我将其显示为:http://localhost:3000/userpage?id=2&name=CoolShop但我希望它为http://localhost:3000/userpage/CoolShop。我知道friendly_id gem可以帮助我,但这需要一个用户页面模型。
  3. 请注意,用户页面只是一个用户页面,其详细信息不是设计提供的注册详细信息,因此我不想为此创建单独的模型。

1 个答案:

答案 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

宝石正在帮助你轻松做到这一点。

并且您不需要新模型。