2016-02-26 2 views
3

Возможно ли установить охранники с помощью AASM, контролирующего доступ к событиям с помощью роли пользователя?AASM, охраняемый current_user

Это похоже на довольно распространенный случай использования, но я не могу найти хорошо согласованный ответ. Многие люди, похоже, предлагают сохранить логику разрешений в контроллерах, что, безусловно, работает, но означает, что система логики конечного автомата истекает в несколько контроллеров. Это плохо по нескольким причинам, но наиболее важным является то, что любые обновления для 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 

Чтобы проверить пользователя по умолчанию.

Это лучший способ приблизиться к этой проблеме? Кто-нибудь имеет лучшее предложение?

ответ

1

Я использую драгоценный камень sentient_user, который нарушает работу MVC, но позволяет вам получить доступ к User.current из ваших моделей.

+1

Я редко перебежать упоминание одного из моих проектов, но когда я делаю, это делает мой день! Драгоценность sentient_user была написана именно для этих целей в рельсах 1.2 -> 2.0 переходных дней. Он по-прежнему работает точно так, как предполагалось, без каких-либо фундаментальных изменений с тех пор. Я понимаю, почему вы говорите, что это нарушение MVC, но, возможно, поскольку ваша бизнес-логика зависит от того, кто это делает, current_user имеет значение, а не является нарушением. Мы передаем данные между слоями все время, и все это делает. –

0

Доступ 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 
Смежные вопросы