如何在我的控制器中分离角色创建的关注点

How to separate the concern of role creation in my controllers

在阅读了一些设计模式之后,我被 SRP(单一职责原则)这个词困住了,我开始研究我的控制器。我发现了一个可能违反单一责任原则的例子。我说的 create 动作应该只负责确定对象是否被创建是对的吗?我最初也将角色创建逻辑放在同一个动作中。 (即创建对象后,向创建该对象的用户添加 'owner' 角色)。

def create
    @car_new_form = CarNewForm.new(current_user)
    if car_id = @car_new_form.submit(params[:car_new_form])
        current_user.add_role :owner, Car.find(car_id)
        redirect_to edit_car_path(car_id)
    else
        render 'new'
    end
end

我尝试将其移动到表单对象中 car_new_form。然而,似乎我只是在把烂摊子移到别处,而没有解决关注点分离。

考虑到关注点分离,我应该如何管理角色管理add_role

我假设您当前正在 CarNewForm 中处理持久性。考虑拥有一个 CreateCar 服务,该服务将由 CarNewForm 在内部调用以创建您的 Car 对象。

有关汽车创建(包括角色分配)的职责将由该服务处理。

示例服务实施:

class CreateCar
  # service = CreateCar.new(@car, current_user)
  # success_action if service.call

  def initialize(car, owner)
    @car = car
    @owner = owner
  end

  def call
    if @car.save
      owner.add_role(:owner, @car)
      return true 
    end
    false
  end
end