破いて捨てたノート

Webやテクノロジーやそれ以外に関する思いつき

Railsで1つのviewに複数のURLを与えるrouting

先日、少し特殊なルーティングを実装した。 viewとしては普通のnewフォームなのでURL的には/counselings/newとするのが普通なのだが、以下の理由から/counselingsというURLでもnewをrenderするようにしたいとの要望がきた。

  • メール等にも記載するURLなのでなるべく短くしたい
  • このページはこの機能のトップページでもあるので/counselingsでREST的にも間違ってはいないだろう

何も考えずにroutesを書くとこうなるだろう。

get '/counselings' => 'counselings#new'
resources :counselings, only: [:new]

ただ、さすがにこれは醜い。 Railsに詳しい有識者に伺いを立てたところ、以下ような書き方を教えていただいた。

get 'counselings(/new)' => 'counselings#new'

ルーティングの中で正規表現を使えるようだ。知らんかった(´・ω・`)スゲー!!

しかし、同じページに複数のURLが存在するのは、どうもSEO的にあまりよろしくないらしい。 ということで結局!Redirectさせるということで落ち着いたw
やっぱり、1つのviewに複数のURLを与えるのはよろしくないよねー

get '/counselings' => 'counselings#new', as: 'new_counseling'
get '/counselings/new' => redirect('/counselings')

若干醜いが、特殊な処理をしている感が滲み出ているし、まあこれくらいでよいのでないか。

ちなみに、このとき知ったのだが、routingのredirectionにはparameterを使った書き方もできるようだ。

get '/stories/:name', to: redirect {|params, req| "/posts/#{params[:name].pluralize}" }
get '/stories', to: redirect {|p, req| "/posts/#{req.subdomain}" }

ref: http://guides.rubyonrails.org/routing.html#redirection