複数レコードに対する操作を Rails で作るとき、どのような URL やモデル設計にするのが綺麗なのか?


#1

Railsのきれいなコードのお題案 · Issue #1 · clean-rails-ja/conversationからの転載

普通の Rails で作られる RESTful には無い bulk update な要件。

ToDo リストで複数のタスクに対して「まとめて完了にする」「まとめてタグを付ける」などをする機能。
remember the milkの画面がイメージに近いです。

todo

似たような機能でありがちなものだと、「通知をまとめて既読にする」とかもあります。


#2

クラスの違うものが並んでいたりするともっと迷いますね
まずどこのコントローラに要求投げればいいのかとか。


#3

この例で言うと、POROでToDoListというモデルが作れるんじゃないだろうか。
複数のものを持つ上位概念を集約ルートとして定義できるか、まず考える。
どうしても合致する概念が無いならCollectionクラスを定義します。


#4

ルーティング(とコントローラ)について。
「複数のタスクをまとめて操作」なのでいわゆるバルクアップデートですね。

CRUDを素直に考えると、コレクションリソースである tasks への PUT/PATCH になります。なのでそれを特別なアクションに割り当てる。

# config/routes.rb
resources :tasks
patch :tasks, to: 'tasks#bulk_update'

PATCH /tasks(.:format) tasks#bulk_update

もっと細かく「まとめて完了」という操作だけに注目するなら、複数のタスクのステータスだけをリソースとして切り出す。

# config/routes.rb
resources :tasks
namespace :tasks do # resources のネストでも書けるけどシンプルにならない
  resource :status_attribute, only: %i(show update)
end

PATCH /tasks/status_attribute(.:format) tasks/status_attributes#update

僕ならこのどちらかにします。


#5

諸手を上げて賛成もできないのですが、DHHのgistにあったので貼っておきます