Yak shaving logs


My life is just yak shaving.

URL変更にともなうリダイレクト処理をRailsで実装する

2017/06/02 #rails

By Yusuke Takita


こんにちは。Kajitz inc.の瀧田です。

URLを変更したときは、ブックマークしてくれているユーザーがいたり、外部サイトからのリンクがあることを考慮して、変更前のURLから変更後のURLにリダイレクトすることが一般的です。
具体的な例をあげると、WebサイトのリニューアルにともないURLを変更するシチュエーションで、変更前のURLにアクセスがあったら変更後のURLにリダイレクトをかけるようなケースです。

こんな人におすすめ

  • 変更前のURLから変更後のURLにリダイレクトする方法が知りたい
  • routes.rbで1行ずつリダイレクトを書くのはダルいしダサいと思っている人

実装方針

大きく分けると次の2つの実装があります。

  1. routes.rbで1つずつリダイレクトしてあげる

get ':author_name/articles/:id' => redirect("/articles/:id")

  1. リダイレクトするURLをモデルで管理して、routes.rbで管理しているURLを全てリダイレクトしてあげる

routes.rbで1つずつリダイレクトしてあげるのは面倒ですし、かっこ悪いので2.の方法で実装します。

実装

まずは修正前のURLとリダイレクト先のURLを管理するモデルを作成します。

app/models/redirection.rb

 +class Redirection < ActiveHash::Base
 +  self.data = [
 +    {id: 1, before:'/blog/posts', after:'/' },
 +    {id: 2, before:'/blog/posts/2', after:'/' },
 +    {id: 3, before:'/blog/posts/4', after:'/' },
 +    {id: 4, before:'/blog/posts/5', after:'/' },
 +  ]
 +end

redirectionモデルからデータを取得してルーティングに追加します。

config/routes.rb

 +  Redirection.all.each do |redirection|
 +    get redirection.before.to_s => redirect(redirection.after.to_s)
 +  end

上記の修正後に修正前のURLにアクセスして修正後のURLにリダイレクトされればOKです。

参考

この記事と同じ方針でリダイレクト処理を行うやり方が記載されています。
上記のブログとこの記事では以下の点が異なります。

  1. 管理画面からURLのリダイレクトの設定ができるようにしていない
    そもそも頻繁にURLのリダイレクトの設定を行わないため、この記事では管理画面からリダイレクトの設定をできるようにしていません。

  2. ModelはActiveRecordではなくActiveHashを利用している
    管理画面からリダイレクトの設定をできるようにしていないので、リダイレクトのデータを変更することはほぼありません。
    そのためデータはDBで持つのではなく静的に持ちたいのでActiveHashを利用しています。

このエントリーをはてなブックマークに追加

categories


最新記事


tags