서비스를 사용하여 콜백을 피하는 방법.



종종 프로그래머는 콜백을 남용하여 결국 코드가 혼란스럽고 명확하지 않다는 것을 완전히 이해하지 못합니다. 콜백을 사용하지 않는 방법에는 여러 가지가 있습니다. 오늘은 서비스를 사용하여이를 수행하는 방법을 알려 드리겠습니다.

코드를 보자:

class User < ApplicationController
  def create
    @user = User.new(user_params)
    if @user.save
      redirect_to root_path, notice: "User created!"
    else   
      render :new, error: 'Failed to create user!'
    end
  end
end
class User < ApplicationRecord
  before_create :populate_serial_number
  private
  def populate_serial_number
    self.serial_number ||= SecureRandom.uuid
  end
end


이 코드의 문제점은 무엇입니까? 우리는 명백하지 않은(마법적인) 행동을 취합니다. 매개변수의 일련 번호에 대한 데이터를 전달하지 않으며 이 값을 어디에도 명시적으로 설정하지 않습니다. 이는 콜백과 함께 자동으로 발생합니다.

서비스를 사용하여 같은 것을 구현해 봅시다.

class CreateUser
  def self.call(params)
    @user = User.new(params)

    populate_serial_number(@user)
    # Other actions for the user

    user.save!
  end
  def self.populate_serial_number(user)
    user.serial_number ||= SecureRandom.uuid
  end
end
class User < ApplicationRecord
end
class User < ApplicationController
  def create
    @user = CreateUser.call(user_params)
    if @user
      redirect_to root_path, notice: "User created!"
    else   
      render :new, error: 'Failed to create user!'
    end
  end
  def user_params
    ...
  end
end


이 접근법은 우리에게 어떤 이점을 제공합니까?
  • 관리자 패널과 API를 통해 사용자를 생성할 수 있다고 가정합니다. 생성 방법에 따라 사용자와 함께 수행되는 일련의 작업이 다를 수 있습니다. 사용자 생성을 위해 두 개의 별도 서비스를 만드는 것이 매우 편리합니다. 예: Admin::CreateUser 및 Api::CreateUser
  • 이러한 서비스는 테스트하기 쉽습니다.
  • 확장하기 쉽습니다.
  • 코드가 훨씬 더 명확해지고 예측 가능해집니다.
  • 좋은 웹페이지 즐겨찾기