Ruby
Rails

RailsアプリでURLにidじゃなく、任意文字列でアクセス出来るようにしておく

ルーティングルールのresourcesやmemberなどでURLに:idを伴うときに、多くの場合PrimaryKeyを使ってしまいがちですが、将来、要望として任意の文字列で代用したい。なんてことが考えられるので、簡単に修正ができるように備えておきます。

URLに:idを含むとき。

Request: http://APP_URL/users/:id

単純なコントローラ処理の例。

users_controller.rb
class UsersController < ApplicationController
  def show
    user = User.find_by_id(params[:id])
    ...
  end
end

将来に備えた例。

users_controller.rb
class UsersController < ApplicationController
  def show
    user = User.key(params[:id]).first
    ...
  end
  ...
end
user.rb
class User < ActiveRecord::Base
  ...
  scope :key, lambda { |key| where(id: key) }
  ...
end

scopeなどで抽象化しておけば、usernameでアクセスしたくなったときなどにscopeを変更するだけで対応できます。

user.rb
  scope :key, lambda { |key| where(username: key) }

応用が効くので、将来変更するかな?ってときには使っておくといいかもしれません。