13
respostas

Como fazer um sistema de login e senha?

Quando o meu usuario quer inserir um aviso novo ele tem que se identificar novamente sendo que eu quero que haja um sistema de sessão para que não seja necessário ele digitar quem ele é para criar um aviso novo no mural. Não tem nenhuma aula explicando como fazer isso. Como eu faço?

13 respostas

A forma mais comum de fazer algum tipo de login no Rails se você precisa de algo padrão é utilizar a gem Devise.

Ela já trata pra você da sessão e você pode configurar quando expirá-la.

Ok, vou tentar aqui e se eu tiver dificuldades aviso

Estou com problemas ao fazer a migração do bd depois que eu dou o generate devise Usuario (minha model):

rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: duplicate column name: email: ALTER TABLE "usuarios" ADD
"email" varchar DEFAULT '' NOT NULL
C:/Sites/sistema/db/migrate/20181108005749_add_devise_to_usuarios.rb:7:in `block
 in up'
C:/Sites/sistema/db/migrate/20181108005749_add_devise_to_usuarios.rb:5:in `up'

Caused by:
ActiveRecord::StatementInvalid: SQLite3::SQLException: duplicate column name: em
ail: ALTER TABLE "usuarios" ADD "email" varchar DEFAULT '' NOT NULL
C:/Sites/sistema/db/migrate/20181108005749_add_devise_to_usuarios.rb:7:in `block
 in up'
C:/Sites/sistema/db/migrate/20181108005749_add_devise_to_usuarios.rb:5:in `up'

Caused by:
SQLite3::SQLException: duplicate column name: email
C:/Sites/sistema/db/migrate/20181108005749_add_devise_to_usuarios.rb:7:in `block
 in up'
C:/Sites/sistema/db/migrate/20181108005749_add_devise_to_usuarios.rb:5:in `up'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)

Você já tinha o model user? Não rodou o devise duas vezes?

Seu sistema está em produção? Se não tiver roda um rails db:migrate:reset.

Se não der certo roda um db:migrate:status e cola o resultado aqui.

Já tinha o model Usuario (como o meu model se chama) e não tinha instalado o Devise duas vezes.

O meu sistema está em produção, o banco de dados está um pouco povoado, mas nada que eu não possa repovoá-lo novamente, ainda não está pronto.

Ao rodar o rails db:migrate:reset veio:

C:\Sites\sistema>rails db:migrate:reset
Permission denied @ unlink_internal - C:/Sites/sistema/db/development.sqlite3
Couldn't drop database 'db/development.sqlite3'
rails aborted!
Errno::EACCES: Permission denied @ unlink_internal - C:/Sites/sistema/db/develop
ment.sqlite3
bin/rails:4:in `require'
bin/rails:4:in `<main>'
Tasks: TOP => db:drop:_unsafe
(See full trace by running task with --trace)

Ao rodar o rails db:migrate:status veio:

C:\Sites\sistema>rails db migrate:status
config.eager_load is set to nil. Please update your config/environments/*.rb fil
es accordingly:

  * development - set it to false
  * test - set it to false (unless you use a tool that preloads your test enviro
nment)
  * production - set it to true

C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/activerecord-5.1.6/lib/acti
ve_record/connection_adapters/connection_specification.rb:246:in `resolve_symbol
_connection': 'migrate:status' database is not configured. Available: ["default"
, "development", "test", "production"] (ActiveRecord::AdapterNotSpecified)
        from C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/activerecord-5
.1.6/lib/active_record/connection_adapters/connection_specification.rb:227:in `r
esolve_connection'
        from C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/activerecord-5
.1.6/lib/active_record/connection_adapters/connection_specification.rb:141:in `r
esolve'
        from C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/activerecord-5
.1.6/lib/active_record/connection_handling.rb:55:in `establish_connection'
        from C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/activerecord-5
.1.6/lib/active_record/railtie.rb:124:in `block (2 levels) in <class:Railtie>'
        from C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/activesupport-
5.1.6/lib/active_support/lazy_load_hooks.rb:69:in `instance_eval'
        from C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/activesupport-
5.1.6/lib/active_support/lazy_load_hooks.rb:69:in `block in execute_hook'
        from C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/activesupport-
5.1.6/lib/active_support/lazy_load_hooks.rb:60:in `with_execution_control'
        from C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/activesupport-
5.1.6/lib/active_support/lazy_load_hooks.rb:65:in `execute_hook'
        from C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/activesupport-
5.1.6/lib/active_support/lazy_load_hooks.rb:50:in `block in run_load_hooks'
        from C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/activesupport-
5.1.6/lib/active_support/lazy_load_hooks.rb:49:in `each'
        from C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/activesupport-
5.1.6/lib/active_support/lazy_load_hooks.rb:49:in `run_load_hooks'
        from C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/activerecord-5
.1.6/lib/active_record/base.rb:326:in `<module:ActiveRecord>'
        from C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/activerecord-5
.1.6/lib/active_record/base.rb:25:in `<top (required)>'
        from C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/activesupport-
5.1.6/lib/active_support/dependencies.rb:292:in `require'
        from C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/activesupport-
5.1.6/lib/active_support/dependencies.rb:292:in `block in require'
        from C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/activesupport-
5.1.6/lib/active_support/dependencies.rb:258:in `load_dependency'
        from C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/activesupport-
5.1.6/lib/active_support/dependencies.rb:292:in `require'
        from C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/railties-5.1.6
/lib/rails/commands/dbconsole/dbconsole_command.rb:105:in `configurations'
        from C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/railties-5.1.6
/lib/rails/commands/dbconsole/dbconsole_command.rb:90:in `config'
        from C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/railties-5.1.6
/lib/rails/commands/dbconsole/dbconsole_command.rb:16:in `start'
        from C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/railties-5.1.6
/lib/rails/commands/dbconsole/dbconsole_command.rb:6:in `start'
        from C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/railties-5.1.6
/lib/rails/commands/dbconsole/dbconsole_command.rb:155:in `perform'
        from C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/thor-0.20.0/li
b/thor/command.rb:27:in `run'
        from C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/thor-0.20.0/li
b/thor/invocation.rb:126:in `invoke_command'
        from C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/thor-0.20.0/li
b/thor.rb:387:in `dispatch'
        from C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/railties-5.1.6
/lib/rails/command/base.rb:63:in `perform'
        from C:/RailsInstaller/Ruby2.3.3/lib/ruby/gems/2.3.0/gems/railties-5.1.6
/lib/rails/command.rb:44:in 

`

e agora eu não consigo sequer acessar uma página do rails.

EDIT: consegui voltar, mas ainda está triste parece que tem alguma cosia errada com o bd...

O model user se chama Usuario no meu bd e ele já existe, o que devo fazer??

Agora que fiz o sistema voltar à minha configuração original, segue o stauts:

C:\Sites\sistema2>rails db:migrate:status

database: C:/Sites/sistema2/db/development.sqlite3

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20181104031034  Create usuarios
   up     20181104031046  Create avisos
   up     20181106171013  ********** NO FILE **********

Bom se você já tinha email no seu usuário você pode editar a migration que o devise cria para não fazer o email, ou você pode remover o atributo email do seu model e fazer com que o devise crie.

ps.: Tem uma migration orfã aí um bin/rails db:migration:reset RAILS_ENV=development deve resolver seu problema.

Não tem necessidade nenhuma de fazer o reset, eu coloquei um migration novo mandando acrescentar uma linha para senha :encrypted_password no rails.

Dei o db:migrate e funcionou bem, fiz até uma view de login associada a um controller para o usuário logar no sistema antes de começar a usar.

O Devise já está instalado, eu preciso apenas saber como que eu realizo a autenticação do usuário para ele iniciar a sessão.

Depois que o Devise já está instalado, com a migrations dele e configurado, você já pode fazer login. Dê um rails routes para ver as rotas geradas por ele. No seu caso deve ser algo como /usuarios/sign_in. Ele trata de guardar a sessão nos controllers internos dele.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software