4

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

检查默认用户。

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

4

2 回答 2

1

我使用了sentient_user gem,它确实破坏了 MVC,但允许你User.current从你的模型中访问。

于 2016-03-24T23:48:20.063 回答
0

在保护子句中访问 c​​urrent_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
于 2016-04-22T13:31:24.147 回答