LoginSignup
4
3

More than 5 years have passed since last update.

サイトリニューアルで古くなったURLから新しいURLにリダイレクトする処理をスタイリッシュに実装する

Last updated at Posted at 2017-06-02

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を利用しています。

その他

ブログからの転載です。

4
3
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
4
3