Railsでふつうにシステムを作っていくと、/articles/20
のようにIDの値からURLを生成するようになっています。ただ、これでは不満な場面もあるかもしれません。
それ用のfriendly_id
というGemもあるのですが、使わなくてもそれなりに簡単に実装できました。
変えるべき場所2箇所
URLの表記を変えようと思えば、「URLを生成する部分」と「URLを解釈する部分」の2箇所に手を入れる必要があります。幸い、もともと変えやすいように作られていますので、それに乗っかればさほど手間はかからずに済みました。
どういうURLにするかと、データ領域の準備
今回は、/articles/some-key
のように、文字列のスラッグをURLにすることを考えてみます。まずは、スラッグ用のデータ領域を用意しましょう。
add_column :articles, :slug, :string, null: false
add_index :articles, :slug, unique: true
スラッグが重複してはまずいのでUNIQUE
は必須ですし、スラッグだけを識別に使うのであればNOT NULL
も必要となります。入力フォームもスラッグを入れられるように改修が必要ですが、そちらはいったん省略します。
URL生成部分
article_path(@article)
で、IDではなくスラッグを見るようにする必要がありますが、これはモデルの#to_param
というメソッドを呼んでいます。これをオーバーライドしましょう。
def to_param
slug
end
これで、URLヘルパーによって生成されるURLも、スラッグ利用に切り替わります。
コントローラー側
あとは、コントローラーでスラッグから記事を引くようにするだけです。
def get_article
Article.find_by!(slug: params[:id])
end
なお、find_by!
としているのは、記事がなかった場合にActiveRecord::RecordNotFound
を投げるという、find
と同じ挙動をさせるためです。