13
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

RailsのURLをID以外から付ける

Posted at

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というメソッドを呼んでいます。これをオーバーライドしましょう。

article.rb
def to_param
  slug
end

これで、URLヘルパーによって生成されるURLも、スラッグ利用に切り替わります。

コントローラー側

あとは、コントローラーでスラッグから記事を引くようにするだけです。

articles_controller.rb
def get_article
  Article.find_by!(slug: params[:id])
end

なお、find_by!としているのは、記事がなかった場合にActiveRecord::RecordNotFoundを投げるという、findと同じ挙動をさせるためです。

13
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?