2011-10-23 17 views
9

Ho giocato con has_secure_password e ho avuto un problema. Il mio test per l'azione di creazione nel mio UsersController non era funzionante al passaggio . Così ho iniziato a giocare sulla console e mi sono reso conto che la password non veniva convertita in un ha e salvata nel campo password_digest.Rails 3.1.1 has_secure_password digest non può essere vuoto

Quando provo a creare un utente dalla console succede quanto segue.

irb(main):031:0> u = User.new(:email => "[email protected]", :password => "test", :password_confirmation => "test") 
=> #<User id: nil, email: "[email protected]", password_digest: nil, created_at: nil, updated_at: nil> 
irb(main):032:0> u.save 
=> false 
irb(main):033:0> u.errors 
=> #<ActiveModel::Errors:0x00000100cde500 @base=#<User id: nil, email: "[email protected]", password_digest: nil, created_at: nil, updated_at: nil>, @messages={:password_digest=>["can't be blank"]}> 

Non sono sicuro di cosa sto facendo male. Sembra che l'attributo password_digest non venga mai assegnato. Se creo un oggetto utente senza attributi e assegno singolarmente ciascun attributo, ottengo lo stesso errore.

Ecco il mio modello

class User < ActiveRecord::Base 
    has_secure_password 
    attr_accessible :email, :password, :password_confirmation 
end 

Grazie per l'aiuto in anticipo.

Alex Shenoy

risposta

0

ho fatto un esempio semplice e ha funzionato come previsto. Forse hai qualcosa nella tua configurazione che sta scherzando con questo. La mia semplice test:

$ rails new test 
$ cd test 
$ rails g model user name:string password_digest:string 
$ rake db:migrate 
$ vim app/model/user.rb 

aggiungere

has_secure_password 
attr_accessible :name, :password, :password_confirmation 

salvare ed uscire

$ rails c 

Loading development environment (Rails 3.1.1) 
ruby-1.9.2-p290 :001 > u = User.new(:name => "[email protected]", :password => "test", :password_confirmation => "test") 
=> #<User id: nil, name: "[email protected]", password_digest: "$2a$10$08xY7p.8hq1.95ZQsx63ku05YfvVqSQ/CLiqUW5dtGhZ...", created_at: nil, updated_at: nil> 
ruby-1.9.2-p290 :002 > u.save 
Binary data inserted for `string` type on column `password_digest` 
    SQL (51.4ms) INSERT INTO "users" ("created_at", "name", "password_digest", "updated_at") VALUES (?, ?, ?, ?) [["created_at", Sun, 23 Oct 2011 13:38:49 UTC +00:00], ["name", "[email protected]"], ["password_digest", "$2a$10$08xY7p.8hq1.95ZQsx63ku05YfvVqSQ/CLiqUW5dtGhZSP9S7FtUy"], ["updated_at", Sun, 23 Oct 2011 13:38:49 UTC +00:00]] 
=> true 
10

Ho avuto lo stesso sintomo, un messaggio che il password_digest non può essere vuoto. Il problema che ho avuto era che avevo impostare questo nel user.rb:

attr_accessor :password 

Questa impedito la password method = da essere chiamato (vedi secure_password.rb)

# Encrypts the password into the password_digest attribute. 
    def password=(unencrypted_password) 
    @password = unencrypted_password 
    unless unencrypted_password.blank? 
     self.password_digest = BCrypt::Password.create(unencrypted_password) 
    end 
    end 

e quindi il valore era mai impostato per la password_digest.

Per me, la correzione era rimuovere la riga attr_accessor.

2

Ho avuto un problema molto simile. Il mio avrebbe salvato l'utente, ma password_digest era sempre nil. Per me è stato perché ho avuto il seguente ordine di codice nel mio modello:

attr_accessible :name, :password, :password_confirmation 
has_secure_password 

ho cambiato in:

has_secure_password 
attr_accessible :name, :password, :password_confirmation 

Ora funziona perfettamente.

Problemi correlati