前回のアンケートアプリに機能を追加して、管理者は質問の順序を変更できるようにします。
今回はルーティングについて推敲してみます。
現状のルーティングは次のようになります。
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" }
これで進めてみます。