読者です 読者をやめる 読者になる 読者になる

kikeda1104's blog

備忘録・技術に関することを書いています。(webエンジニア)

friendly idを利用したURI設計

Ruby Rails

プロジェクトでSEO対策と数値を含めずにURIを設計するため、friendly_idを採用してURIの再設計をしました。

railsではURIにmodelの主キーを含める形の設計が主になりますが、数値では分かりづらくなります。(resourceでは作成されませんが)

それほど複雑な仕様でもないため、gemを使わず、参照しているmodelのnameカラムがありましたので英語名を追加することで実現しました。

サンプルコードは、実際に実装したコードとは異なります。

環境

Rails appの作成

# rails new friendly_app
# cd friendly_app
# ./bin/rails g scaffold users name_en:string
# ./bin/rails db:migrate

実装

app/models/user.rbに、idではなくname_enを利用するように書き換える。

# app/models/user.rb
モデルに'#to_param'を追記する。

class User < ApplicationRecord
 validates :canonical_name,
        uniqueness: { case_sensitive: false },
        format: { with: /\A[A-Za-z][\w-]\z/ },
        length: { minimum: 3, maximum: 25 }

  def to_param
    name_en ? name_en : id.to_s
  end

  def self.find(input)
    find_by(name_en: input) || super
  end
end

rails s

app serverを起動して。

# ./bin/rails s

動作確認

  • users/newでユーザを作成する。
  • users/:name_enに移動する。

f:id:kikeda1104:20160829233032p:plain

まとめ

route.rbがresourcesのままになっており params[:id]でname_enの値を受け渡すことになりわかりずらくなるので、idを受け渡さない画面ではroute.rbを変更しました。

参考URL

Friendly URLs in Rails · GitHub

Railsで、URLにIDでなく名前を入力して、アクセスする方法 - Qiita

ActiveRecord::Integration

Railsの正規表現でよく使われる \A \z って何?? - Qiita