はじめに
Railsでは、routes.rbでresourcesメソッドを使用すると、通常:idパラメータがデフォルトで使われますが、
場合によっては表示を変更したい場合もあるかと思います。
今回はidをnameカラムに変更する方法を記載します。
目標
開発環境
ruby 2.5.7
Rails 5.2.4.3
OS: macOS Catalina
前提
※ ▶◯◯ を選択すると、説明等が出てきますので、
よくわからない場合の参考にしていただければと思います。
【Ruby on Rails】gemのdeviseを使用し、名前とパスワードのみでログインする方法
こちらをベースにURLを変更していきます。
準備
前提記事では、URLがmypageになっているため、
今回はあえてidをつけたURLにしていきます。
※変更点のみ記述します。
get 'mypage', to: 'homes#mypage'
↓
get 'mypage/:id', to: 'homes#mypage', as: 'mypage'
def after_sign_up_path_for(resource)
mypage_path
end
↓
def after_sign_up_path_for(resource)
mypage_path(@user)
end
def after_sign_in_path_for(resource)
mypage_path
end
↓
def after_sign_in_path_for(resource)
mypage_path(@user)
end
def mypage
end
↓
def mypage
@user = User.find(params[:id])
end
これでidがついたURLができました。
idをnameカラムに変更
同一の名前のURLをなくす
URLをカラムにするためには、同一のnameをなくす必要がありまあす。
そこでvalidationをかけます。
モデルのバリデーション
validates :name, uniqueness: true
DBのバリデーション
$ rails g migration add_index_users_name
class AddIndexUsersName < ActiveRecord::Migration
def change
add_index :users, :name, unique: true
end
end
$ rails db:migrate
実際にidをnameに変更
findをfind_byにするのが肝です。
get 'mypage/:id', to: 'homes#mypage', as: 'mypage'
↓
get 'mypage/:name', to: 'homes#mypage', as: 'mypage'
def mypage
@user = User.find(params[:id])
end
↓
def mypage
@user = User.find_by(name: params[:id])
end
加えてリンク先もnameで指定するために
to_paramメソッドを使用します、
validates :name, uniqueness: true
# ↓追加
def to_param
name
end
これで目標と同じになるはずです。
resourcesを使用する場合
resourcesに下記のように追記すればOKです。
resources :users, param: :name
これでリンク先もnameで表示されるはずです。
まとめ
このように数字ではなく、文字列にすることで、
どのページにいるかがわかりやすく、利便性が高まります。
また、SNSのようなサービスで数字のIDを使用してしまうと、
今何人の登録者がいるかわかってしまうため、あまり推奨できる方法ではないです。
その時はこの方法を試してみてください。
またtwitterではQiitaにはアップしていない技術や考え方もアップしていますので、
よければフォローして頂けると嬉しいです。
詳しくはこちら https://twitter.com/japwork