Оказывается, все, что мне нужно было сделать, это переопределить метод find_for_authentication моей модели пользователя:
class User < ActiveRecord::Base
...
# Intercept Devise to check if DealershipUser's Dealership is active
def self.find_for_authentication(conditions)
user = super
return nil if user.is_a?(DealershipUser) && user.dealership.deleted?
user
end
...
end
- Найдите пользователя обычным способом, позвонив в super.
- Я использую STI, поэтому проверяю, является ли пользователь DealershipUser, а затем проверяю, удален ли дилерский центр (acts_as_paranoid).
- Вернуть пользователя.
Это очень специфическое решение для моего сценария, но вы можете переопределить find_for_authentication, если захотите, если впоследствии вернете пользователя.