やりたいこと
- できるだけ#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/