AASM由current_user守卫

时间:2016-02-26 02:35:41

标签: ruby-on-rails aasm

是否可以使用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

检查默认用户。

这是解决此问题的最佳方式吗?有人有更好的建议吗?

2 个答案:

答案 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