如何在我的控制器中分离角色创建的关注点
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
在阅读了一些设计模式之后,我被 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