Возможно ли установить охранники с помощью 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
Чтобы проверить пользователя по умолчанию.
Это лучший способ приблизиться к этой проблеме? Кто-нибудь имеет лучшее предложение?
Я редко перебежать упоминание одного из моих проектов, но когда я делаю, это делает мой день! Драгоценность sentient_user была написана именно для этих целей в рельсах 1.2 -> 2.0 переходных дней. Он по-прежнему работает точно так, как предполагалось, без каких-либо фундаментальных изменений с тех пор. Я понимаю, почему вы говорите, что это нарушение MVC, но, возможно, поскольку ваша бизнес-логика зависит от того, кто это делает, current_user имеет значение, а не является нарушением. Мы передаем данные между слоями все время, и все это делает. –