是否可以使用 AASM 设置按用户角色控制事件访问的警卫?
这似乎是一个相当常见的用例,但我找不到一致同意的答案。许多人似乎建议将权限逻辑保留在控制器中,这当然可行,但意味着将状态机逻辑注入到多个控制器中。这有几个原因很糟糕,但最关键的是,对 SM 的任何更新都需要找到所有使用情况,以便与模型一起修改。
我提出的解决方案有效,但我很好奇是否有人找到了更好的解决方案。
我的解决方案:
在我的 AASM 课程中,我包括了;
aasm do
before_all_events set_user
event :sample_event, :guard => :user_can? do
transition ...
end
end
private
def set_user user
@user = user
@user ||= User.new
end
def user_can?
@user.some_check_on_attributes?
end
这反过来又允许我在我的控制器中执行以下操作:
aasm_class.sample_event current_user
检查当前用户,或交替进行;
aasm_class.sample_event
检查默认用户。
这是解决这个问题的最佳方法吗?有人有更好的建议吗?