在 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
,我正在考虑将其存储在全局变量中?我认为每当调用控制器动作时,它总是一个“新鲜”的调用,对吗?如果是这样,那么将当前用户存储为全局变量不应该带来任何风险..(就像其他用户能够访问其他用户的详细信息一样)
任何见解表示赞赏!
更新
所以,全局变量路由出来了!感谢 PeterWong 指出全局变量仍然存在!
我现在正在考虑使用这种方式:
class Rules
def self.can_sell_car?(current_user, car)
......checks....
end
end
Rules.can_sell_car?(current_user,@car)
然后从控制器动作中调用。对这种新方式有什么想法吗?