Help us understand the problem. What is going on with this article?

RailsでURL末尾のスラッシュ(trailing_slash)を個別に設定

More than 3 years have passed since last update.

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'  # スラッシュなし

これで、/itemlink_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で公開していた内容を移行しました。

naokazuterada
Engineer, Designer, Co-founder of Karappo Inc., Creator of MarkdownTOC https://karappo.net/ https://noracast.jp/ https://podcastfreaks.com/ https://github.com/naokazuterada/MarkdownTOC
http://karappo.net
karappo
ウェブ・インタフェース・グラフィックなどを中心に、デザイン及びコンサルティングを行う会社です。企画からデザイン、実装まで、ワンストップで対応することができます。
https://karappo.net
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away