14
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

shallowオプションでroutesを整える

Last updated at Posted at 2018-12-21

今回は、shallowメソッドが非常に便利だったのでご紹介します。

#shallowオプションとは何か?
ルーティングの記述を複雑にせず、かつ深いネストを作らないという絶妙なバランスを保つことのできるオプションです!

では、具体的にはどのようなことか?

コードを交えて見ていきましょう。

#shallowオプションの使用前

resources :posts, only: %i(index show new create destroy) do
    resources :likes, only: %i(create destroy)
end

このようなroutesファイルがあったとします。

ネストしてますね。

では、このネストしているlikesのURLを確認してみます。

$rails routes -c likes
    Prefix Verb   URI Pattern                         Controller#Action
post_likes POST   /posts/:post_id/likes(.:format)     likes#create
 post_like DELETE /posts/:post_id/likes/:id(.:format) likes#destroy

destroyアクションの/posts/:post_id/likes/:id(.:format)って見づらいですよね?

それがshallowオプションを使えば、簡単に完結に解決します。

#shallowオプションの使用後

resources :posts, only: %i(index show new create destroy) do
    resources :likes, only: %i(create destroy), shallow: true
  end

では実際にshallowオプションを使用してみます。

これで、先程と同様にlikesのURLを確認してみると・・・

$ rails routes -c likes
    Prefix Verb   URI Pattern                     Controller#Action
post_likes POST   /posts/:post_id/likes(.:format) likes#create
      like DELETE /likes/:id(.:format)            likes#destroy

/likes/:id(.:format)に変わり、

shallowオプションを使う前のdestroyよりも、だいぶ見やすくなりましたよね!

しかもとっても簡単!

#親リソースで指定も可能

resources :articles, shallow: true do
  resources :comments
  resources :quotes
  resources :drafts
end

上記のように親リソースに直接shallowオプションを指定することも出来ちゃいます。

この場合だと全てのネストしたリソースが浅くなるそうです!

【参考記事】
https://railsguides.jp/routing.html

14
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?