2015-06-30 13 views
1

После прочтения некоторых шаблонов проектирования я застрял со словом SRP (принцип единой ответственности), и я начал смотреть на свой контроллер. Я нашел один пример, где он может нарушать принцип единой ответственности. Правильно ли я говорю, что действие на создание должно отвечать только за то, чтобы убедиться, что объект создан или нет? Я изначально поставил логику создания роли в том же самом действии. (т. е. после создания объекта, добавления и «владельца» роли для пользователя, создавшего объект).Как отделить заботу о создании ролей в моих контроллерах

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, учитывая разделение проблем?

ответ

1

Я предполагаю, что вы в настоящее время обрабатываете постоянство в 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 
+0

Я прочитал немного об извлечении объектов обслуживания в рубиновых моделях конструкций с помощью кода-климата. вы могли бы написать пример кода? благодаря! –

+0

@ChrisYeung: Добавлен образец сервиса. Это можно вызвать из вашего контроллера или из «NewCarForm». Возможно, имеет смысл включить это в «NewCarForm» в зависимости от того, как вы определяете обязанности своей формы. – fylooi

+0

благодарим за код! –