2013-07-30 9 views
6

रेल 4 मैं अपने उपयोगकर्ता मॉडल में has_secure_password का उपयोग के साथ, चाल का कहना है कि अगर मैं निर्धारित नहीं करते हैं: password_confirmation यह शुरू किया जा कभी नहीं होगा लेकिन मैं क्यों त्रुटि मिलती है जब मैं परीक्षण चलाने : पासवर्ड पुष्टि नहीं हो सकता खाली निम्नलिखित के रूप में:रेल 4 has_secure_password प्रस्तुत करना पासवर्ड पुष्टि वैकल्पिक

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 

अपने परीक्षण फ़ाइल देखो की तरह:

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 

क्यों मैं इस त्रुटि मिलती है, वहाँ के रूप में उस के लिए olution? इस के लिए धन्यवाद के

उत्तर

5

बदलें आपके परीक्षण के before लाइन:

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

कि यह ठीक करना चाहिए।

क्या इस बारे में है:

तुम्हें पता है कि जब आप काफी किसी भी वेबसाइट पर एक नया खाता बनाने, वे आप से पूछना एक पासवर्ड बनाने और उसे दो बार प्रवेश करने के लिए? यही वह है। जब आप कोई नया उपयोगकर्ता बनाते हैं, तो has_secure_password यह सुनिश्चित करने के लिए पासवर्ड दो बार चाहता है कि आपने टाइपो नहीं बनाया है।

यदि password! = password_confirmation, यह एक अपवाद फेंक देगा और उपयोगकर्ता नहीं बनाया जाएगा।

फिर से, यह केवल उपयोगकर्ता निर्माण पर उपयोग किया जाता है। आपको लॉगिन फॉर्म या किसी अन्य चीज़ में दो पासवर्ड दर्ज करने की आवश्यकता नहीं है। आपको इस क्षेत्र को अपने मॉडल या डीबी में जोड़ने की ज़रूरत नहीं है।

यदि आपके पास उपयोगकर्ता निर्माण फ़ॉर्म है, और आप password_confirmation फ़ील्ड नहीं चाहते हैं, तो आपको यह नहीं करना है। इससे पहले कि आप सहेजें या जो कुछ भी कॉल करें, आप अपने नियंत्रक में password_confirmation = password सेट कर सकते हैं।

लेकिन उपयोगकर्ता निर्माण के लिए, password_confirmationचाहिए उपस्थित होना

+0

लेकिन मैं अपने अनुप्रयोग के लिए password_confirmation जोड़ नहीं होगा, मैं सिर्फ एक पासवर्ड एक बार – medBo

+0

की जरूरत इसका उपयोग केवल उपयोगकर्ता निर्माण के दौरान किया जाता है। आपको इसे अपने मॉडल में जोड़ने की आवश्यकता नहीं है (और नहीं माना जाता है)। यह 'has_secure_password' की एक विशेषता है। –

+0

मुझे समझ में नहीं आता है कृपया आप और अधिक समझा सकते हैं! (मेरे रूप में मैं पासवर्ड के लिए एक फ़ील्ड बसूंगा और पासवर्ड पुष्टि के लिए दूसरा नहीं) – medBo

21

लंबी कहानी कम

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

लंबी कहानी

  1. docs और the source code कहते हैं:

    आप पुष्टि सत्यापन की जरूरत नहीं है , बस पासवर्ड_confirmation विशेषता के लिए कोई मान सेट न करें और सत्यापन ट्रिगर नहीं किया जाएगा।

  2. लेकिन वे यह भी कहना है:

    सत्यापन बनाने पर पासवर्ड की उपस्थिति, पासवर्ड (अ + password_confirmation + विशेषता का उपयोग) की पुष्टि के लिए स्वचालित रूप से जुड़ जाते हैं। यदि आप सत्यापन बंद करना चाहते हैं, सत्यापन पास करना चाहते हैं: तर्क के रूप में गलत। यदि आवश्यकता हो तो आप हाथ से अधिक सत्यापन जोड़ सकते हैं।

  3. आइटम # 1 एक पूर्ण विवरण नहीं है। हमें सभी सत्यापन को बंद करने की आवश्यकता है और इस कार्य को बिंदु # 2 में वर्णित करने के लिए हमारे स्वयं के सत्यापन नियम जोड़ें।

मैंने इस पर कुछ समय बिताया और एक सबक मिला: जब आप उलझन में हैं तो स्रोत कोड ढूंढें। यह एक दर्दनाक तरीका या कठिन तरीका प्रतीत होता है, लेकिन कभी-कभी यह सही तरीका है।

+0

उपस्थिति: सत्य मान्यताओं के रूप में काम नहीं करेगा: झूठी उपस्थिति की स्थिति को हटा देता है। हालांकि, न्यूनतम लंबाई 6 है, इससे कोई फर्क नहीं पड़ता – shailesh

+1

रेल 4 पूरी तरह से पुष्टि को अनदेखा करता है अगर आप इसे पैरामीटर के रूप में नहीं भेजते हैं, इसलिए यदि आप 'password_confirmation' विशेषता को श्वेतसूची में भूलना भूल जाते हैं, तो इसे अनदेखा कर दिया जाएगा और आपकी मान्यताओं को जीता जाएगा एक बात मत कहो। इस पर सावधान! –

+0

@ शैलेश 'सत्यापन: झूठी 'केवल' has_secure_password' द्वारा जोड़े गए डिफ़ॉल्ट सत्यापन को हटा देता है। पासवर्ड फ़ील्ड पर 'उपस्थिति: सत्य' जैसे कस्टम सत्यापन जोड़ना अभी भी इरादे के रूप में काम करेगा। – mltsy

1

जब तक मैं 4.1 करने के लिए और उससे आगे रेल 4.0.13 से इस एप्लिकेशन को मिलता है मैं एक अस्थायी उपाय के रूप में इस किया:

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

यह वास्तव में क्या करता है, क्या यह सत्यापन को हटा देता है या पासवर्ड के बराबर पासवर्ड पुष्टिकरण करता है? –

+1

@SurgePedroza उत्तरार्द्ध। अगर पुष्टिकरण शून्य है, तो वैधता चलाने से पहले इसे पासवर्ड मान असाइन किया जाता है। –

संबंधित मुद्दे