LoginSignup
1
1

More than 5 years have passed since last update.

Rails で resource ベースに確認画面を設計する

Posted at

概要

Rails で確認画面を作るとき confirm みたいな action を定義してしまうのですが
Rail から外れている気がしてメンテナンス性を欠いているように思います.

そこで DHH 流 Controller をベースに確認画面を設計します

方針

「確認」は 登録/編集 という作業 resource の create/show であると考えます.

よって 作業 resource に対して Controller を定義する

例1. ユーザー登録

Controller

app/controllers/users_controller.rb
class UsersController < ApplicationController
  def create
    @user = User.register!(params[:user])
  end
end
app/controllers/user_registrations_controller.rb
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

app/controllers/users_controller.rb
class UsersController < ApplicationController
  def update
    @user = User.find(params[:id])
    @user.revise!(params[:user])
  end
end
app/controllers/users/revisions_controller.rb
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

app/controllers/user_bulk_works_controller.rb
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
app/controllers/user_bulk_revisions_controller.rb
class UserBulkRevisionsController < ApplicationController
  def update
    @user_bulk = UserBulk.new(params[:user_bulk))
    @user_bulk.revise!
  end
end

考え方

ユーザー一括作業 という resource を定義して createshow.html.erbrender して作業内容を表示する.

一括編集処理は UserBulkRevisionController#update が担う

今後の拡張

作業内容を好きなときに(URLを叩けば)確認したい...となった場合は UserBulkWork を Model にして DB に作業内容を保持させてそれを表示する.
show が確認画面となる

app/controllers/user_bulk_works_controller.rb
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 して定義する

app/controllers/user_bulk_works/revisions_controller.rb
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 と捉える

1
1
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
1
1