2011-07-01 18 views
29

मेरे पास एक कस्टम नियंत्रक है जो कोड here कोड के आधार पर उपयोगकर्ता पासवर्ड के संपादन को संभालता है।पासवर्ड सत्यापित नहीं कर रहा पासवर्ड/पासवर्ड पुष्टि

उपयोगकर्ता मॉडल

attr_accessible :password, :password_confirmation, :username, :login 
... 
devise :database_authenticatable, 
     :lockable, 
     :registerable, 
     :recoverable, 
     :rememberable, 
     :trackable 

PasswordsController

expose(:user) { current_user } 

def update 
    if user.update_with_password(params[:user]) 
    sign_in(user, :bypass => true) 
    flash[:notice] = "success" 
    else 
    render :edit 
    end 
end 

मेरे संपादित पासवर्ड प्रपत्र here स्थित है।

समस्या यह है कि कोई भी बात जो मैं दर्ज करता हूं (या उस मामले में प्रवेश नहीं करता) संपादन पासवर्ड रूप में, "सफलता" फ़्लैश विधि प्रदर्शित होती है।

+0

क्या यह सब काम करता है कि यह कैसे होना चाहिए? अगर पुष्टिकरण फ़ील्ड मेल नहीं खाता है या current_password गलत है, तो यह पासवर्ड नहीं बदलता है? – Dex

+0

यह अभी भी इसमें जो कुछ भी है, उसे बदलता है: पासवर्ड (अगर कुछ भी) में है, इस पर ध्यान दिए बिना पासवर्ड: password_confirmation। –

+0

यदि आप पैरामीटर [: उपयोगकर्ता] [: पासवर्ड] == पैराम्स [: उपयोगकर्ता] [: password_confirmation] 'पर if स्टेटमेंट बदलते हैं तो क्या होता है और शरीर में 'user.update_with_password (पैराम्स [: user])' डाल दें ? –

उत्तर

62

यदि आप डेविस को सत्यापन करना चाहते हैं, तो आपको अपने मॉडल में :validatable मॉड्यूल जोड़ने की आवश्यकता है। यह करने के लिए काफी आसान है बस devise कॉल में मॉड्यूल की सूची में :validatable जोड़ते हैं, ताकि अपने मॉडल का कहना है:

devise 
    :database_authenticatable, 
    :lockable, 
    :registerable, 
    :recoverable, 
    :rememberable, 
    :trackable, 
    :validatable 

इस वसीयत सत्यापन जोड़ने कर देगा।

एक और आसान तरीका है अपनी खुद की मान्यताओं को जोड़ना। आप सिर्फ इतना है कि पासवर्ड पुष्टिकरण मेल खाता मान्य करने के लिए चाहते हैं, तो आप अपने मॉडल को यह जोड़कर एक validates_confirmation_of सत्यापन जोड़ सकते हैं:

validates_confirmation_of :password 

मुझे आशा है कि इस मदद करता है।

+1

'validates_confirmation_of: पासवर्ड' जो मैं खो रहा था –

1

नियंत्रक में अद्यतन के लिए अपनी वस्तु खोजें।

user = User.find_by_id(params[:id]) 
    unless user.blank? 
     if user.update_attributes(params[:user]) 
     flash[:notice] = "User updated successfully." 
     redirect_to "somwhere" 
     else 
     render :action => 'edit' 
     end 
    else 
     render :action => 'edit' 
    end 

आप तो पुराने पासवर्ड को अद्यतन अद्यतन करने से पहले इन पंक्ति जोड़ने के लिए तो नए कोड होगा नहीं करना चाहते हैं:

user = User.find_by_id(params[:id]) 
     unless user.blank? 
      params[:user].delete(:password) if params[:user][:password].blank? 
      params[:user].delete(:password_confirmation) if params[:user][:password_confirmation].blank? 
if user.update_attributes(params[:user]) 
      flash[:notice] = "User updated successfully." 
      redirect_to "somwhere" 
      else 
      render :action => 'edit' 
      end 
     else 
      render :action => 'edit' 
     end 

लिखने user.rb मॉडल में इस तरह somthing

devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable, :locakable 
4

मुझे लगता है कि आप रेल 4

before_action में application_controller.rb में मजबूत पैरामीटर प्रारंभ करने में भूल गया:, configure_permitted_parameters यदि: devise_controller? संरक्षित

def configure_permitted_parameters  
    devise_parameter_sanitizer.for(:sign_up){|u|u.permit(:email,:password,:password_confirmation)} 
end 
+1

यह मुझे थोड़ा सा है, मैं sanitized पैरामीटर की सूची में 'password_confirmation' जोड़ने के लिए भूल गया, धन्यवाद! – hernandes

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