2013-07-30 26 views
6

raylar ile 4 kullanıyorum kullanıcı modelimde hassecure_password, trick şunu söylüyor: Eğer password_confirmation ayarlamazsam asla tetiklenmeyecek ama neden testi çalıştırdığımda hata alıyorum :raylar 4 has_secure_password render şifre onayı isteğe bağlı

Failures: 

1) User 
Failure/Error: it { should be_valid } 
    expected #<User id: nil, name: "joe", email: "[email protected]", created_at: nil, 
    updated_at: nil, password_digest: "$2a$04$mcRr/msgYQR3kBVc3kv/m.UotBJuJuSXZKMw 
    /eHTvU87..."> to be valid, but got errors: Password confirmation can't be blank 

benim test dosyası görünüm gibi: bu hatası alıyorum neden

require 'spec_helper' 

describe User do 

    before { @user = User.new(name: 'joe', email: '[email protected]', password: 'foo') } 

    subject { @user } 
    #.... 
    #.... 
    describe "when password is not present" do 
    before { @user.password = "" } 
    it { should_not be_valid } 
    end 
end 

olarak orada Şifre onayı aşağıdaki boş olamaz Bunun için olution? Buna thank en

cevap

5

Değişim Testinizin before satır: düzeltmek gerekir

before { @user = User.new(
    name: 'joe', 
    email: '[email protected]', 
    password: 'foo', 
    password_confirmation: 'foo') #<== this line! 
} 

.

bu konuda Nedir:

Sen hemen hemen her web sitesinde yeni bir hesap oluşturduğunuzda, bir parola oluşturun ve iki kez girmeniz ya? İşte bu da bu. Yeni bir kullanıcı oluşturduğunuzda, has_secure_password, yazım hatası yapmadığınızdan emin olmak için iki kez şifre ister.

password! = password_confirmation ise, bir istisna atar ve kullanıcı oluşturulmaz.

Yine, bu yalnızca kullanıcı oluşturulmasında kullanılır. Giriş formuna veya başka bir şeye iki şifre girmeniz gerekmez. Bu alanı modelinize veya DB'ye eklemeniz gerekmez.

Kullanıcı oluşturma formunuz varsa ve password_confirmation alanınız yoksa, yapmanız gerekmez. Kaydetmeyi veya herhangi bir şeyi aramadan önce, kontrol cihazınıza password_confirmation = password'u ayarlayabilirsiniz.

Ama Kullanıcı oluşturma için

, password_confirmation zorunluluk bulunması.

+0

ama benim app password_confirmation eklemek olmaz, ben bir kez sadece bir şifre – medBo

+0

gerek Sadece kullanıcı oluşturma sırasında kullanılır. Bunu modelinize eklemeniz (ve yapmamanız) gerekmez. Bu, has_secure_password’un bir özelliğidir. –

+0

anlamıyorum lütfen daha fazlasını açıklayabilir misiniz! (Benim formumda şifre için bir alan ve parola onayı için başka bir şey juste ederdim) – medBo

21

Uzun lafın kısası

has_secure_password validations: false # This is the key to the solution 
validates :password, presence: true, length: { minimum: 6 } # Or an length you want 

Uzun hikaye

    docs
  1. ve the source code ki:

    Onay doğrulama gerekmiyorsa Sadece password_confirmation özniteliğine herhangi bir değer ayarlamayın ve doğrulama tetiklenmez.

  2. Ama aynı zamanda ki:

    Doğrulamaları oluşturmak parolası varlığında, (a + password_confirmation + özelliğini kullanarak) şifre teyidi için otomatik olarak eklenir. Doğrulamaları kapatmak isterseniz, geçerliliği iletin: false bir bağımsız değişkeni olarak. Gerekirse, daha fazla doğrulamayı el ile ekleyebilirsiniz.

  3. Öğe # 1 tam tanım değil. numaralı tüm doğrulamaları kapatmalı ve bunu # 2 numaralı noktada açıklandığı gibi yapmak için kendi doğrulama kurallarımızı eklememiz gerekir.

Bu konuda biraz zaman harcadım ve bir dersim var: Kafanız karıştığında kaynak kodunu bulun. Bu acı verici bir yol ya da zor bir yol gibi görünüyor, ama bazen doğru yol.

+0

varlığı: true doğrulama olarak çalışmaz: false, varlık durumunu kaldırır. Bununla birlikte, minimum uzunluk 6 olduğundan, bu bir parametre olarak göndermezseniz, – shailesh

+1

Rails 4 onaylamayı tamamen reddeder, bu nedenle 'password_confirmation' özelliğini beyaz listeye almayı unutursanız, göz ardı edilir ve onaylarınız kazanılır. Bir şey söyleme. Buna dikkat et! –

+0

@shailesh 'validations: false ', yalnızca" has_secure_password "tarafından eklenen varsayılan değerleri kaldırır. Parola alanında "varlık: true" gibi özel doğrulamalar eklemek, gerektiği gibi çalışmaya devam edecektir. – mltsy

1

ben 4.1 ve ötesine Raylar 4.0.13 Bu uygulamanın elde edene kadar ben geçici bir önlem olarak bu yaptı:

class User < ActiveRecord::Base 
    has_secure_password 
    # Tempfix until Rails 4.1 https://github.com/rails/rails/pull/11107#issuecomment-21850919 
    raise "Get rid of this on Rails 4.1+" if Rails::VERSION::STRING != "4.0.13" 
    before_validation { self.password_confirmation ||= password } 
end 
+0

Tam olarak ne yapar, doğrulama işlemini kaldırır veya parola ile parola doğrulaması yapar mı? –

+1

@SurgePedroza İkincisi. Onay geçersizse, doğrulamadan önce şifre değeri atanır. –