Railsのルーティングで、末尾にスラッシュを付けたい時の話です(Rails4.x系はデフォルトではつかない)。
全部につけていい場合は、下記の様にしておしまいです。
application.rb
config.action_controller.default_url_options = { :trailing_slash => true }
全部ではなく、パスによって付けたり付けなかったりしたい場合は下記のようにします。
routes.rb
get '/item' => 'item#index', trailing_slash: true # スラッシュ付き
get '/item/hoge' => 'item#hoge' # スラッシュなし
これで、/item
はlink_to
などで出力されるリンクに/item/
のようにスラッシュが付きます。
/item/hoge
の方はスラッシュが付きません。
最後に、ダイレクトに/item
にリクエストがあった時に/item/
へリダイレクトする処理もやっておきたいです(今のままだと/item
もそのまま普通に表示されてしまいます)。Rack層でやるのが良いような記事も見かけましたが、できればRails内で処理したい…。
ちょっと見通しが悪くなるのですが、コントローラー内に書いてあげると実現できました。
複数コントローラーで同じことをしたいこともあると思うので、まずは下記。
application_controller.rb
# trailing_slashがついてない場合、slash付きのパスにリダイレクトする
def force_trailing_slash
redirect_to "#{request.original_url}/" unless request.original_url.match(/\/$/)
end
そして、夫々のコントローラーのリダイレクトしたいアクションにこのフィルタをかまします。
item_controller.rb
before_filter :force_trailing_slash, only: 'index'
これで、/item
が/item/
にリダイレクトされるようになります。
この記事は2015.4.10にこちらのURLで公開していた内容を移行しました。