URLを変更したときは、ブックマークしてくれているユーザーがいたり、外部サイトからのリンクがあることを考慮して、変更前のURLから変更後のURLにリダイレクトすることが一般的です。
具体的な例をあげると、WebサイトのリニューアルにともないURLを変更するシチュエーションで、変更前のURLにアクセスがあったら変更後のURLにリダイレクトをかけるようなケースです。
こんな人におすすめ
- 変更前のURLから変更後のURLにリダイレクトする方法が知りたい
- routes.rbで1行ずつリダイレクトを書くのはダルいしダサいと思っている人
実装方針
大きく分けると次の2つの実装があります。
- routes.rbで1つずつリダイレクトしてあげる
get ':author_name/articles/:id' => redirect("/articles/:id")
- リダイレクトする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です。
参考
railsで煩雑なリダイレクトの管理 というブログでも紹介されています。
この記事と同じ方針でリダイレクト処理を行うやり方が記載されています。
上記のブログとこの記事では以下の点が異なります。
管理画面からURLのリダイレクトの設定ができるようにしていない
そもそも頻繁にURLのリダイレクトの設定を行わないため、この記事では管理画面からリダイレクトの設定をできるようにしていません。ModelはActiveRecordではなくActiveHashを利用している
管理画面からリダイレクトの設定をできるようにしていないので、リダイレクトのデータを変更することはほぼありません。
そのためデータはDBで持つのではなく静的に持ちたいのでActiveHashを利用しています。
その他
ブログからの転載です。