2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Railsの/users/:id/を/{ random_srting }にする: Routingを脱デフォルト

Last updated at Posted at 2020-07-22

やりたいこと

  • できるだけ#Showアクションへのpathを短縮したい
  • pathにidが含まれるのはデメリットが多いと感じた
  • /users/:id/に:idを使うのをやめたい

備忘録的に残しておきます

/users/:id/の:idをid以外の属性にする

model: to_param を使う

url_tokenにSecureRandom.urlsafeでURL-safeなランダム文字列を生成し、
idの代わりに用いる例

現在日時 + 乱数とかをエンコードするようにすると衝突の可能性は低くなるかも

class Article < ApplicationRecord
  attribute :url_token, :string, default: -> { SecureRandom.urlsafe_base64(8) }
.
.
.
  def to_param
    url_token
  end
end

uuidなら以下の通り
(以下uuidを採用して説明を残します、URLを短縮したいという目的には合わないと思います)

class Article < ApplicationRecord
  attribute :uuid, :string, default: -> { SecureRandom.uuid }
.
.
.
  def to_param
    uuid
  end
end

Controller

あとはコントローラーでparams[:id]を使っている部分をparams[:uuid]に書き換える

Routing: param: :uuid

Rails.application.routes.draw do
  resources :users, param: :uuid
.
.
.
end

param: :uuidと書き加えるだけ
これで/users/:id/users/:uuidに置き換わる

/users/:uuidを/:uuidにしたい

Routing: param: :uuid

path: '/'を追加する

Rails.application.routes.draw do
  resources :users, param: :uuid, path: '/'
.
.
.
end

このときのroutingをRails routesで確認すると

       users GET    /                        users#index
             POST   /                        users#create
    new_user GET    /new(.:format)           users#new
   edit_user GET    /:uuid/edit(.:format)    users#edit
        user GET    /:uuid(.:format)         users#show
             PATCH  /:uuid(.:format)         users#update
             PUT    /:uuid(.:format)         users#update
             DELETE /:uuid(.:format)         users#destroy

users_pathはGET '/'でroot_pathと重複するし、
POST /Routing Error: No route matches [POST] "/users"となりうまくいかない

よって暫定的な対応として、index, new, create以外のアクションのみをルートベースなpathとすることにした

実際のroutes.rb

Rails.application.routes.draw do
  resources :users, only: [:index, :new, :create]
  resources :users, param: :uuid, path: '/', only: [:show, :edit, :update, :destroy]
  .
  .
  .
end

なんだかブサイクだけととりあえずこれでやってみます

参考

rails で /users/:id ではなく /:username な routing にする方法 · Yuichi Takada https://blog.takady.net/blog/2015/11/29/rails-routing-with-username-instead-of-id/

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?