railsでアプリを作っていてurlにidカラム以外を設定したくなったので調べた時のメモ。
そんなに難しくなかったのでサラッと忘れないように記載しておく。
前提条件
URLをid以外で表現したいモデル
projectモデルを使って実装方法を記載
projectモデルというかテーブル構造は下記。
identifierカラムをURLに利用したい。
id:bigint name:string url:string description:text identifier:string:uniqu timestamps
実装方法
手順は下記で行っていく。
- routes.rbの修正
- projects_controller.rbの修正
- 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以外を利用するための設定完了です。 実際に動かして試してみましょう。