8

मैं अपना प्रोग्राम सेट करने की कोशिश कर रहा हूं ताकि पासवर्ड केवल तभी मान्य हो जब यह बदला जाता है (इसलिए कोई उपयोगकर्ता अपना पासवर्ड डाले बिना अन्य जानकारी संपादित कर सकता है)।अपरिभाषित विधि password_changed? त्रुटि

मैं वर्तमान में user.rb में कोई त्रुटि है कि कहते हैं

NoMethodError in UsersController#create, undefined method `password_changed?' for #<User:0x00000100d1d7a0> 

जब मैं में लॉग इन करने की कोशिश हो रही है

यहाँ मेरी मान्यता कोड है:।

validates :name, :presence => true, 
:length => { :maximum => 50 } 
validates :email, :presence => true, 
:format  => { :with => email_regex }, 
:uniqueness => { :case_sensitive => false } 
validates :password, :presence =>true, :confirmation => true, :length => { :within => 6..40 }, :if=>:password_changed? 

यहाँ मेरी बनाने की विधि है users_controller.rb में:

def create 
    @user = User.new(params[:user]) 
    if @user.save 
     sign_in @user 
     flash[:success] = "Welcome to the Sample App!" 
     redirect_to @user 
    else 
     @title = "Sign up" 
     render 'new' 
    end 
end 

धन्यवाद!

उत्तर

5

बदलें साथ:

:if => lambda {|user| user.password_changed? } 

मैं दो अलग अलग सत्यापन करना चाहते हैं:

validates :password, :presence =>true, :confirmation => true, :length => { :within => 6..40 }, :on => :create 
validates :password, :confirmation => true, :length => { :within => 6..40 }, :on => :update, :unless => lambda{ |user| user.password.blank? } 
+0

नहीं, अभी भी वही त्रुटि मिलती है। – steffi2392

+1

आपके मॉडल के कॉलम 'पासवर्ड' है? डेटाबेस में – apneadiving

+0

? नहीं, बस एन्क्रिप्टेड_पासवर्ड। क्या मुझे इसे जोड़ना चाहिए? – steffi2392

3

मैं इस एक ही समस्या का सामना करना पड़ा और इस पोस्ट को पढ़ने के बाद मैं कोड में apneadiving ने सुझाव दिया कार्यान्वित उसका जवाब लेकिन मामूली संशोधन के साथ:

मैंने दो अलग-अलग सत्यापनों का उपयोग किया, एक एफ या बनाएँ:

validates :password, :presence => true, :confirmation => true, :length => { :within => 6..128 }, :on => :create 

और उसके बाद मैं अद्यतन के लिए यह एक प्रयोग किया है: मूल रूप से

validates :password, :presence => true, :confirmation => true, :length => { :within => 6..128 }, :on => :update, :unless => lambda{ |user| user.password.to_s.empty? } 

, मैं लागू वास्तव में क्या apneadiving सुझाव दिया, लेकिन मैंने महसूस किया कि उपयोगकर्ता के लिए अद्यतन पर यह वास्तव में मान्य नहीं किया गया था एक स्ट्रिंग की उपस्थिति। जैसा कि, यह उपयोगकर्ता को अपना पासवर्ड " " (व्हाइटस्पेस की एक स्ट्रिंग) पर सेट करने की इजाजत दे रहा था। यह तथ्य यह है कि " ".blank? == true की वजह से है, और इसलिए आप इसे इस तरह से मान्य करने के लिए सेट किया है:

:unless => lambda { |user| user.password.blank? } 

फिर यदि खाली स्थान के से भरा एक स्ट्रिंग उपयोगकर्ता क्योंकि प्रस्तुत किया जाता है द्वारा प्रस्तुत किया जाता है यह मान्यता नहीं चलेंगे यह स्ट्रिंग को खाली होने के रूप में पढ़ता है। यह अनिवार्य रूप से अद्यतन पर उपस्थिति के सत्यापन के प्रभाव को अमान्य करता है। बस password.empty? की बजाय त्रुटियों को रोकने के लिए है अगर कोई उपयोगकर्ता मॉडल पर update_attributes कहता है और पासवर्ड, फ़ील्ड में कुछ भी पास नहीं करता है, तो पासवर्ड nil होगा, और चूंकि रूबी nil कक्षा नहीं है खाली है? विधि, यह एक त्रुटि फेंक देगा। को nil पर कॉल करना, हालांकि इसे एक खाली स्ट्रिंग में परिवर्तित कर देगा, जो लगातार .empty? कॉल पर सत्य लौटाएगा (इस प्रकार सत्यापन पूर्ण नहीं होगा)। तो कुछ परीक्षणों और विपत्तियों के बाद मैंने पाया कि यह करने का यह सबसे अच्छा तरीका था।

1

कम से कम रेल 4 में देखने के लिए परिवर्तन password_digest है।

@account.password = "my new password" 
@account.changes # => {"password_digest"=>["$2a$10$nR./uTAmcO0CmUSd5xOP2OMf8n7/vXuMD6EAgvCIsnoJDMpOzYzsa", "$2a$10$pVM18wPMzkyH5zQBvcf6ruJry22Yn8w7BrJ4U78o08eU/GMIqQUBW"]} 
@account.password_digest_changed? # => true 
+0

यह मेरे लिए तय है, धन्यवाद! – IGNIS

+0

इसी प्रकार, उपरोक्त में से कोई भी मेरे लिए काम नहीं करता है। इसके बजाय मैं इसके साथ समाप्त हुआ, बस: 'validates_presence_of: password_confirmation, अगर: lambda {| staff | staff.password.present? } ' तो अब इसे बनाने और अपडेट दोनों पर password_confirmation की आवश्यकता है, और केवल तभी पासवर्ड पासवर्ड भेजा गया है। मुझे आश्चर्य है कि यह डिफ़ॉल्ट व्यवहार नहीं है। –

1

यहां समाप्त हुई इस त्रुटि संदेश googling, और

@account.encrypted_password_changed?

का उपयोग करने में मेरे मामले सामने आए कि मैं क्या चाहता था।

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