Как реализовать "бизнес-правила" в Rails?
Допустим, у меня есть машина, и я хочу ее продать:
car = Cars.find(24)
car.sell
car.sell
метод проверитнесколько вещей:
does current_user own the car?
check: car.user_id == current_user.id
is the car listed for sale in the sales catalog?
check: car.catalogs.ids.include? car.id
if all o.k. then car is marked as sold.
Я думал о создании класса с именем Rules:
class Rules
def initialize(user,car)
@user = user
@car = car
end
def can_sell_car?
@car.user_id == @user.id && @car.catalogs.ids.include? @car.id
end
end
И использовал его так:
def Car
def sell
if Rules.new(current_user,self).can_sell_car
..sell the car...
else
@error_message = "Cannot sell this car"
nil
end
end
end
Что касается полученияcurrent_user
, я думал о сохранении его в глобальной переменной?Я думаю, что всякий раз, когда вызывается действие контроллера, это всегда «свежий» вызов, верно?Если это так, то сохранение текущего пользователя в качестве глобальной переменной не должно представлять каких-либо рисков ... (как, например, некоторые другие пользователи могут получить доступ к данным другого пользователя)
Любые идеи приветствуются!
ОБНОВЛЕНИЕ
Итак, глобальная переменная route отсутствует!Спасибо PeterWong за указание на то, что глобальные переменные сохраняются!
Теперь я думаю об использовании этого способа:
class Rules
def self.can_sell_car?(current_user, car)
......checks....
end
end
И затем вызове Rules.can_sell_car?(current_user,@car)
из действия контроллера.Есть мысли по этому новому пути?