Используя вашу методологию, я бы определил метод, позволяющий передавать пользователю проверку, следующим образом:
class Client
def self.allowed(user)
if user.is_a?(SuperAdmin)
return self.all
elsif user.is_a?(Client)
return [user]
elsif user.is_a?(ClientAdmin)
return [user.client]
end
end
end
Затем ваши контроллеры могут решить, какого пользователя следует проверять, основываясь на выполняемом действии (хотя обычно это current_user
, это освободит вашу реализацию для работы с любым пользователем, поэтому если Вы решаете добавить функциональность, которая будет зависеть от того факта, о котором вы позже расскажете).
Как говорится, вы должны взять в библиотеке авторизации; Мне лично очень нравится CanCan . Это позволяет вам определять полномочия в одном месте, используя стиль, подобный тому, который вы здесь представляете. У автора, Райана Бейтса, есть отличный скринкаст по использованию CanCan .