びくんびくんしながらコードを書く。

いしきひくい系エンジニアのらくがき帳

Rails 5.2 URLにid以外のカラムを使いたい

railsでアプリを作っていてurlにidカラム以外を設定したくなったので調べた時のメモ。
そんなに難しくなかったのでサラッと忘れないように記載しておく。

前提条件

  • ruby ver 2.4.0
  • rails 5.2.0
  • routesはresourcesで設定している。
  • すでに必要なmodel(テーブル?)にid以外のunique keyが設定されている。

URLをid以外で表現したいモデル

projectモデルを使って実装方法を記載
projectモデルというかテーブル構造は下記。
identifierカラムをURLに利用したい。

id:bigint
name:string
url:string
description:text
identifier:string:uniqu
timestamps

実装方法

手順は下記で行っていく。

  1. routes.rbの修正
  2. projects_controller.rbの修正
  3. project.rb(モデル)の修正

これだけ。

routes.rbの修正

下記部分を修正します。
resources :projects

修正後
resources :projects, param: :identifier

コレでshowやeditで受け付けるパラメータがidからidentifierに変更されます。

projects_controller.rbの修正

上記routes.rbの修正だけだとlink_toで表示されるURLがまだ正しくありません。
また、showやeditなどに入っていったときに取得するデータのキーがidのままになっているので修正が必要です。

修正場所は下記

def set_project
  @project = Project.find(params[:id])
end

修正後

def set_project
  @project = Project.find_by(identifier: params[:identifier])
end

上記修正でURLの判別はできるようになりました。

project.rb(モデル)の修正

作ってすぐ位のときはバリデーション位しか追加されていないかと思います。
ここにlink_toでURLを生成する時のパラメータをidからidentifierへ変更するため、to_paramをオーバーライドするメソッドを追加します。

下記メソッドを追加

def to_param
  identifier
end

以上でURLにid以外を利用するための設定完了です。 実際に動かして試してみましょう。