是否可以使用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
检查默认用户。
这是解决此问题的最佳方式吗?有人有更好的建议吗?
答案 0 :(得分:1)
我使用的sentient_user gem确实打破了MVC,但允许您从模型中访问User.current
。
答案 1 :(得分:1)
在guard子句中访问current_user似乎是一件事(运行AASM 4.10.0):
event :sample_event, guard: user_can? do
transition ...
end
def user_can?(current_user)
current_user.some_check_on_attributes?
end
甚至
event :sample_event, guard: -> (current_user) { current_user.some_check_on_attributes? } do
transition ...
end