Railsのルーティング

前回のアンケートアプリに機能を追加して、管理者は質問の順序を変更できるようにします。
今回はルーティングについて推敲してみます。

参考 Rails のルーティング – Railsガイド

現状のルーティングは次のようになります。

resources :questions, only: %i[ index show ]
bin/rails routes --controller=questions
   Prefix Verb URI Pattern              Controller#Action
questions GET  /questions(.:format)     questions#index
 question GET  /questions/:id(.:format) questions#show

案1
順序を変更するために up と down アクションを追加してみます。

resources :questions, only: %i[ index show ] do
  get "up", "down", on: :member
end
       Prefix Verb URI Pattern                   Controller#Action
  up_question GET  /questions/:id/up(.:format)   questions#up
down_question GET  /questions/:id/down(.:format) questions#down
    questions GET  /questions(.:format)          questions#index
     question GET  /questions/:id(.:format)      questions#show

案2
おっと、データベースに書き込むので GET ではなく POST でした。

resources :questions, only: %i[ index show ] do
  post "up", "down", on: :member
end
       Prefix Verb URI Pattern                   Controller#Action
  up_question POST /questions/:id/up(.:format)   questions#up
down_question POST /questions/:id/down(.:format) questions#down
    questions GET  /questions(.:format)          questions#index
     question GET  /questions/:id(.:format)      questions#show

案3
今度は CRUD アクションだけで考えてみます。

参考 DHHはどのようにRailsのコントローラを書くのか | POSTD

ascending と descending を POST してみます。

resources :questions, only: %i[ index show ] do
  resource :ascending, only: :create, module: "questions"
  resource :descending, only: :create, module: "questions"
end
             Prefix Verb URI Pattern                                  Controller#Action
 question_ascending POST /questions/:question_id/ascending(.:format)  questions/ascendings#create
question_descending POST /questions/:question_id/descending(.:format) questions/descendings#create
          questions GET  /questions(.:format)                         questions#index
           question GET  /questions/:id(.:format)                     questions#show

案4
sort_order をPOST と DELETE するようにしてみます。

resources :questions, only: %i[ index show ] do
  resource :sort_order, only: %i[ create destroy ], module: "questions"
end
             Prefix Verb   URI Pattern                                  Controller#Action
question_sort_order DELETE /questions/:question_id/sort_order(.:format) questions/sort_orders#destroy
                    POST   /questions/:question_id/sort_order(.:format) questions/sort_orders#create
          questions GET    /questions(.:format)                         questions#index
           question GET    /questions/:id(.:format)                     questions#show

まだリソース名はしっくりこないのですが、POST と DELETE で表現してみようと思います。
まだリソース名はしっくりきません。
案5
Writebook を参考にして moves を POST してみます。

resources :questions, only: %i[ index show ] do
  resources :moves, only: :create, module: :questions
end
        Prefix Verb URI Pattern                             Controller#Action
question_moves POST /questions/:question_id/moves(.:format) questions/moves#create

引数で up と down アクションを判断できるようにします。

params: { direction: "up" }
params: { direction: "down" }

これで進めてみます。