2015-06-17 16 views
5

Sto riscontrando un problema con i dispositivi per la password BCrypt: il mio modello User è sia impostato con has_secure_password e validates_presence_of :password.Infissi di rotaie con BCrypt

Il punto è che BCrypt utilizza password e password_confirmation ma nello schema c'è solo il campo password_digest.

L'apparecchiatura lamenta che il campo password non esiste.

Come posso evitare questo?

Grazie

+0

puoi pubblicare i tuoi schemi? – Emanuel

+1

... e forse mostraci l'apparecchio che non funziona. Ci scusiamo per avervi fatto fare tanto lavoro, ma ci aiuta molto di più se possiamo vedere cose come codice e messaggi di errore reali (reclami). –

risposta

-1

Ho risolto questo problema con la funzione di impostazione sulla prova di modello. Possiamo definire gli oggetti nel setup e usarli attraverso il file di test.

def setup 
    @user = User.new 
    @user.name = 'Brunoid' 
    @user.email = '[email protected]' 
    @user.phone = '(01)2345-6789' 
    @user.cpf = '123.456.789-10' 
    @user.password = 'segamastersystem' 
    @user.password_confirmation = 'segamastersystem' 
    @user.card = Card.first 
end 

test 'must validate' do 
    assert @user.valid? 
end 
... 
9

Sembra che gli impianti vengano inviati direttamente al database. Ciò significa che invece di password: è necessario password_digest: nei vostri dispositivi:

test_user: 
    email: "[email protected]" 
    password_digest: <%= BCrypt::Password.create('testpassword', cost: 5) %> 

quando si usano password basate bcrypt con has_secure_password. Come menzionato nei commenti l'argomento cost è facoltativo. Se non lo usi, verrà utilizzato un valore predefinito.

+0

'costo' è opzionale, quindi' BCrypt :: Password.create ('password') 'funziona – Dorian

+0

@Dorian - sì, lo fa. Preferisco comunque impostare il valore in modo esplicito. Mi fa risparmiare ricordando quale è l'impostazione predefinita e mi chiedo se è ottimizzata per sicurezza o efficienza ;-) – silverdr