9
6

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.

【Ruby on Rails】URLのidをカラム名に変更

Last updated at Posted at 2020-10-25

はじめに

Railsでは、routes.rbでresourcesメソッドを使用すると、通常:idパラメータがデフォルトで使われますが、
場合によっては表示を変更したい場合もあるかと思います。
今回はidをnameカラムに変更する方法を記載します。

目標

スクリーンショット 2020-10-25 16.32.12.png

スクリーンショット 2020-10-25 16.31.38.png

開発環境

ruby 2.5.7
Rails 5.2.4.3
OS: macOS Catalina

前提

※ ▶◯◯ を選択すると、説明等が出てきますので、
  よくわからない場合の参考にしていただければと思います。

【Ruby on Rails】gemのdeviseを使用し、名前とパスワードのみでログインする方法
こちらをベースにURLを変更していきます。

準備

前提記事では、URLがmypageになっているため、
今回はあえてidをつけたURLにしていきます。
※変更点のみ記述します。

config/routes.rb
get 'mypage', to: 'homes#mypage'

get 'mypage/:id', to: 'homes#mypage', as: 'mypage'
app/controllers/users/registrations_controller.rb
def after_sign_up_path_for(resource)
  mypage_path
end

def after_sign_up_path_for(resource)
  mypage_path(@user)
end
app/controllers/users/sessions_controller.rb
def after_sign_in_path_for(resource)
  mypage_path
end

def after_sign_in_path_for(resource)
  mypage_path(@user)
end
app/controllers/homes_controller.rb
def mypage
end

def mypage
  @user = User.find(params[:id])
end

これでidがついたURLができました。

idをnameカラムに変更

同一の名前のURLをなくす

URLをカラムにするためには、同一のnameをなくす必要がありまあす。
そこでvalidationをかけます。

モデルのバリデーション

app/models/user.rb
validates :name, uniqueness: true

DBのバリデーション

ターミナル
$ rails g migration add_index_users_name
db/migrate/xxxxxxxxxxxxx_add_index_users_name.rb
class AddIndexUsersName < ActiveRecord::Migration
  def change
    add_index :users, :name, unique: true
  end
end
ターミナル
$ rails db:migrate

実際にidをnameに変更

findをfind_byにするのが肝です。

config/routes.rb
get 'mypage/:id', to: 'homes#mypage', as: 'mypage'

get 'mypage/:name', to: 'homes#mypage', as: 'mypage'
app/controllers/homes_controller.rb
def mypage
  @user = User.find(params[:id])
end

def mypage
  @user = User.find_by(name: params[:id])
end

加えてリンク先もnameで指定するために
to_paramメソッドを使用します、

app/models/user.rb
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

9
6
1

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
9
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?