Adicionado o Guard.
Adicionado o .gitignore
Funcionalidades em comum extraidas.

Aqui eu fiquei na dúvida se dava para você fazer uma modelagem, com, por
exemplo, somente o Person ou o User, sendo que utilizando apenas um daria para
categorizar uma empresa. Uma empresa tem muitos poucos campos a mais que os
outros, e o overhead de deixar esses campos em branco ou lidar com alguma
validação mais especifica poderia compensar o ganho que se teria em lidar com
apenas um modelo.

Daria para fazer usando também single table inheritance (ou STI, uma coisa que a
gente comentou por cima nas aulas), mas só tirando as partes em comum
(lembre-se: DRY) já melhora.
Retornada a autenticação de pessoa por nome.

Não entendi porque você faz dois por email e um por nome, mas tudo bem. :-)
Removidos os "p" (inspect).

No Guard fica feio. :-p
Aproveite os callbacks.

Fora que os métodos de carregamento agora são privados, ficam melhor isolados.
Callbacks e escopo.

Abuse dos callbacks ao invés de chamar os métodos diretamente dentro de um
método do controller. Apesar de funcionar do jeito que estava, os callbacks
deixam mais modular. Você pode até filtrar agora as ações que precisam das
coleções utilizando :only (ou :except no caso inverso).

Ao invés de usar aquele where(permit: true), criei um escopo, fica mais claro
também.
Quando são muitas variáveis, compensa fazer assim.
Removi o resto que dava para trocar por escopo.

E também mandei uma requisição do banco para baixo. Se tiver alguma coisa que
pode dar errado e o usuário seja redirecionado *antes* da requisição, mova ela
para baixo para evitar fazer consultas desnecessárias no banco.
Traduzir deixa bonitinho. :-)
Mais traduções.
Classe para verificar parâmetros de login.

Como você tem 3 controllers de logins diferentes, eu tentei dar uma minimizada
na repetição, movendo a verificação dos parâmetros de login (nesse caso, ainda
diferenciando se é validado por email ou nome) para uma classe, que dispara uma
exceção (que é tratada em cada método, colocando a mensagem no flash[:notice])
no caso de estar faltando alguma coisa.

Repare também que você estava atribuindo algumas variáveis desnecessárias, como
por exemplo:

- name no client, que não é utilizada.
- admin no login, a variável de sessão pega é do atributo do modelo, se válido
- permit no user, sendo que permit sempre vai ser true se o login for válido
Olha a tradução ...
Só uma pequena mudança no método de pegar o layout.