Я нашел 2 решения моей проблемы
Первое, что я придумал сам, это было создание подкласса модели User под названием AdminUser с областью действия по умолчанию, которая позволяла только user_type = 'admin'
class AdminUsers < User
default_scope { where(user_type: 'admin') }
end
Затем я просто обновил файл rout.rb, чтобы использовать эту модель вместо User
devise_for(
:users,
class_name: 'AdminUser',
path: 'auth',
controllers: {
sessions: 'authentications',
passwords: 'passwords'
}
)
. Это прекрасно работает.Единственная маленькая вещь - то, что теперь current_user возвращает экземпляр AdminUser вместо User.Я не мог гарантировать, что это не вызовет проблем в некоторых случаях.
Второе решение было отсюда: https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-sign_in-using-their-username-or-email-address
Я добавил этот метод, который перезаписывает один из внутренних устройств Devises вМодель пользователя.
def self.find_for_database_authentication(warden_conditions)
where(warden_conditions).where("user_type = 'agent'").first
end
Второе решение работает отлично.