不必要なURLを短くできるshallowオプション

こんにちは!kossyです!




本日の気になるニュースはこちら
jp.wsj.com

このメーカーが支払うライセンス料は消費者に跳ね返ってきますよねおそらく。。。
とはいえ、iphoneandroidの端末と比べると価格が高いので、
今すぐに市場が激変する、ところまではいかないような気もしています。

とはいえ、こちらの記事によると、欧州地域のOSシェアは軒並みAndroidiOSを上回っているため、
中長期的には市場に与えるインパクトは大きそうです。
www.globalmarketingchannel.com

新しいOSを提供する会社にはチャンスなのではないでしょうか。










さて、今回は、リソースの関係性を一意に特定できる際に、
不必要なURLを短くできるRailsのルーティングのオプションである、
shallowオプションの使い方について、ブログに残してみたいと思います。



環境
Rails 5.1.6
Ruby 2.5.1
MacOS





URL長くなる問題

ルーティングを記述する際に用いるresourcesメソッドのネストは
リソース同士の関係を表すにはとても便利ですが、場合によっては
URLが長くなってしまうという問題も発生します。

例えば、

routes.rb

  resources :reviews, except: [:index] do
    resources :likes, only: [:create, :destroy]
    end
  end

上記のようなルーティング設計の時に生成される
likesのcreateアクションとdestroyアクションのルーティングは、

$ rails routes

省略

review_likes POST   /reviews/:review_id/likes(.:format)     likes#create
 review_like DELETE /reviews/:review_id/likes/:id(.:format) likes#destroy

となります。
likesのidがレビューのidに依らず一意であるならば、

/likes/:id(:format)

でもいいはずです。



そこで、shallowの登場

そういったケースで、生成されるURLを
短くできるのが、shallowオプションです。

routes.rb

  resources :reviews, except: [:index] do
    resources :likes, only: [:create, :destroy], shallow: true
    end
  end

とすると、

$ rails routes

省略

review_likes POST   /reviews/:review_id/likes(.:format)   likes#create
        like DELETE /likes/:id(.:format)                  likes#destroy


likesのidがレビューのidに依らず一意であるならば、

/likes/:id(:format)

でもいいはずです。

と書いた通りの理想的なURLが生成されています。
また、prefixの構文も少し短くできています。



今回の例ではあまりメリットを感じられないかもしれませんが、
アプリケーションが肥大化してきた際には、可読性の向上、記述するコード量の減少等が
shallow: trueを使うことで実現できると思います。



参考にさせていただいた記事
resources を nest するときは shallow を使うと幸せになれる - Qiita
Rails のルーティング | Rails ガイド