概要
Rails で確認画面を作るとき confirm
みたいな action を定義してしまうのですが
Rail から外れている気がしてメンテナンス性を欠いているように思います.
そこで DHH 流 Controller をベースに確認画面を設計します
方針
「確認」は 登録/編集 という作業 resource の create/show であると考えます.
よって 作業 resource に対して Controller を定義する
例1. ユーザー登録
Controller
class UsersController < ApplicationController
def create
@user = User.register!(params[:user])
end
end
class UserRegistrationsController < ApplicationController
def new
@user = User.new(params[:user])
end
def create
@user = User.new(params[:user])
unless @user.valid?
render action: :new
return
end
render action: :show
end
end
例2. ユーザー編集
Controller
class UsersController < ApplicationController
def update
@user = User.find(params[:id])
@user.revise!(params[:user])
end
end
class Users::RevisionsController < ApplicationController
def new
@user = User.find(params[:user_id])
end
def create
@user = User.find(params[:user_id])
@user.assign_attributes(params[:user])
unless @user.valid?
render action: :new
end
render action: :show
end
end
例3. ユーザー一括編集
管理画面などで複数のユーザー情報を一括編集したい場合.
しかも確認画面を通して確認してから確定したい場合
Controller
class UserBulkWorksController < ApplicationController
def new
@user_bulk_work = UserBulkWork.new(params[:user_bulk])
end
def create
@user_bulk_work = UserBulkWork.new(params[:user_bulk])
if @user_bulk_work.valid?
render action: :show
else
render action: :new
end
end
end
class UserBulkRevisionsController < ApplicationController
def update
@user_bulk = UserBulk.new(params[:user_bulk))
@user_bulk.revise!
end
end
考え方
ユーザー一括作業 という resource を定義して create
で show.html.erb
を render
して作業内容を表示する.
一括編集処理は UserBulkRevisionController#update
が担う
今後の拡張
作業内容を好きなときに(URLを叩けば)確認したい...となった場合は UserBulkWork
を Model にして DB に作業内容を保持させてそれを表示する.
show
が確認画面となる
class UserBulkWorksController < ApplicationController
def create
@user_bulk_work = UserBulkWork.register!(params[:user_bulk])
redirect_to user_bulk_work_path(@user_bulk_work)
end
def show
@user_bulk_work = UserBulkWork.find(params[:id])
end
end
一括編集 resource は nest して定義する
class UserBulkWork::RevisionsController < ApplicationController
def update
@user_bulk_work = UserBulkWork.find(params[:user_bulk_work_id])
@user_bulk_work.revise!
end
end
まとめ
作業に対して resource を定義することで 確認画面を 作業 resource の show と捉える