2010-07-17 10 views
7

इसलिए मुझे लॉगिन, ईमेल पता, पासवर्ड, पासवर्ड पुष्टिकरण, नाम, अवतार (चित्र) इत्यादि के साथ एक उपयोगकर्ता मॉडल मिला है। पहले 5 पर सत्यापन हैं, मूल रूप से यह बताते हुए एक नया मॉडल बनाने के लिए सभी 5 मौजूद हैं।रेल - अपडेट_एट्रिब्यूट्स सत्यापन के खिलाफ आ रहे हैं

हालांकि, इससे मेरे लिए समस्याएं होती हैं जहां अपडेट संबंधित हैं।

मेरे पास एक संपादन पृष्ठ है, जहां उपयोगकर्ता केवल अपना नाम और अवतार संपादित कर सकता है। मैं वर्तमान में उन्हें अपना लॉगिन बदलने की इच्छा नहीं कर रहा हूं, और मैं एक अलग पृष्ठ से ईमेल और पासवर्ड बदलना चाहता हूं। ,

<% form_for @user, :html => { :multipart => true } do |u| %> 
<p> 
    <label>Name:</label> 
    <%= u.text_field :name %> 
</p> 
<p> 
    <label>Avatar:</label> 
    <%= display_user_avatar %> 
    <%= u.file_field :avatar%> 
</p> 
<p> 
    <%= submit_tag %> 
</p> 
<% end %> 

अगर मैं एक @user.update_attributes(params[:user]) करने का प्रयास है, तो है क्योंकि केवल 2 पैरामीटर name और avatar हैं, अद्यतन, विफल रहता है पासवर्ड की तरह सामान, पासवर्ड की पुष्टि के बाद से:

तो संपादित करें प्रपत्र इस तरह दिखता है ईमेल, आदि प्रविष्टि को मान्य करने के लिए आवश्यक हैं, और वे बस उस रूप में मौजूद नहीं हैं।

मैं @user.update_attribute(:name, params[:user][:name]) कर कर इसे प्राप्त कर सकता हूं, लेकिन फिर मुझे चिंता है कि मान्यताओं से परहेज करना एक अच्छा बात है या नहीं। विशेष रूप से पासवर्ड अपडेट जैसे कुछ के संबंध में, जहां मैं को नया पासवर्ड सत्यापित करने की आवश्यकता है।

क्या कोई और तरीका है?

और अगर मैं :name और :avatar के लिए इस update_attribute बस का उपयोग कर रहे थे, मैं इसे कैसे करने के बारे में जाना होगा?

क्या यह काम करेगा?

params[:user].each do |attribute| 
    @user.update_attribute(attribute, params[:user][attribute]) 
end 

क्या यह ऐसा करने का एक स्वीकार्य तरीका है ...?


--edit अनुवर्ती कार्रवाई के रूप में -
Okie, मैंने कोशिश की के रूप में आप का सुझाव दिया और

किया तो यह ! संस्करण कर रहा है, और अपवाद & ब्राउज़र में प्रदर्शित पकड़ा है:

Validation failed: Password is too short (minimum is 5 characters) 

सर्वर लॉग में जानकारी है:

012,
Processing UsersController#update (for 127.0.0.1 at 2010-07-18 11:56:59) [PUT] 
    Parameters: {"user"=>{"name"=>"testeeeeee"}, "commit"=>"Save changes", "action"=>"update", "_method"=>"put", "authenticity_token"=>"BMEGRW/pmIJVs1zlVH2TtZX2TQW8soeCXmMx4kquzMA=", "id"=>"tester", "controller"=>"users"} 

Urm। इसे देखकर, मुझे अभी एहसास हुआ कि यह "id"=>"tester" सबमिट कर रहा है। अब, मेरे पास मेरे मार्ग स्थापित हैं ताकि उपयोगकर्ता उपयोगकर्ता नाम के बजाय उपयोगकर्ता लॉगिन नाम दिखा रहा हो ... क्या ऐसा हो सकता है? यह user_id == tester वाले उपयोगकर्ता को अपडेट करने का प्रयास कर रहा है, लेकिन चूंकि यह अस्तित्व में नहीं है, इसलिए यह इसके बजाय एक बनाने का प्रयास करता है? क्या वास्तव में कुछ ऐसा है जो मैं मार्ग के कारण गलत कर रहा हूं?

हमम ...रेक मार्गों मुझसे कहता है कि मार्ग है:

edit_user GET /users/:id/edit(.:format)        {:action=>"edit", :controller=>"users"} 
      PUT /users/:id(.:format)         {:action=>"update", :controller=>"users"} 

और मैं user.rb फ़ाइल में ऐसे ही मार्ग की स्थापना:

def to_param 
    "#{login}" 
    end 

लेकिन यह निश्चित रूप login यह सब समय id के बजाय प्रदर्शित किया गया है। लेकिन मैं अपडेट एक्शन, @user = User.find_by_login(params[:id]) की शुरुआत में भी सही कर रहा हूं, और फिर @user अपडेट कर रहा हूं।

मैं बहुत उलझन में हूं। >। <


दूसरा अद्यतन:

मेरे User.rb सत्यापन सामान इस प्रकार हैं:

validates_length_of :login, :within => 3..20 
    validates_length_of :password, :within => 5..20 
    validates_presence_of :login, :email, :password, :password_confirmation, :salt, :name, :on => :create 
    validates_uniqueness_of :login, :case_sensitive => false 
    validates_confirmation_of :password 
    validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i, :message => "format is invalid." 
    attr_accessor :password, :password_confirmation 

और hashed_password अनुभाग यहाँ है:

def password=(pass) 
    @password = pass 
    self.salt = User.random_string(10) if !self.salt? 
    self.hashed_password = User.encrypt(@password, self.salt) 
    end 

u.attributes मुझे देता है

>> u.attributes 
=> {"salt"=>"NHpH5glxsU", "name"=>"test er", "avatar_updated_at"=>nil, "updated_at"=>Sat Jul 17 07:04:24 UTC 2010, "avatar_file_size"=>nil, "avatar_file_name"=>nil, "hashed_password"=>"84f8675c1ed43ef7f8645a375ea9f867c9a25c83", "id"=>1, "avatar_content_type"=>nil, "login"=>"tester", "email"=>"[email protected]", "created_at"=>Fri May 07 10:09:37 UTC 2010} 

Urmmm ... ठीक है, तो यह है कि तुम क्या कहा, आभासी विशेषता password वास्तव में अस्तित्वहीन जा रहा है ... तो मैं चारों ओर कि मिलता है के बारे में है? बगजर, मैंने सोचा कि मैं अपने प्रमाणीकरण कोड के साथ स्मार्ट फिडलिंग कर रहा था ...

उन प्रमाणीकरण प्लगइन में से किसी एक को बदलने में कितना आसान है? क्या मुझे एक नया उपयोगकर्ता मॉडल बनाना होगा? या प्लगइन मेरे वर्तमान के साथ काम करने में सक्षम होना चाहिए?

अब तक सभी मदद के लिए धन्यवाद, बीटीडब्ल्यू! : डी

+0

पीएस: हाँ, '

+0

जो आप वर्णन कर रहे हैं वह मेरे लिए बिल्कुल सही नहीं है। मुझे पूरा यकीन है कि यदि आप 'हैश' के साथ 'update_attributes' करते हैं तो केवल गुणों का आंशिक सेट होता है, तो अन्य सभी विशेषताओं के साथ छोड़ दिया जाता है उनके पिछले मानों का अर्थ है कि सत्यापन विफल नहीं होना चाहिए। – mikej

उत्तर

10

मैंने इसे चेक किया है और update_attributes के माध्यम से केवल 2 विशेषताओं का आंशिक अपडेट ठीक काम करता है। अन्य सभी विशेषताओं को उनके पिछले मानों के साथ छोड़ दिया गया है, जिसका अर्थ है कि सत्यापन विफल नहीं होना चाहिए। कुछ बातें की कोशिश करने के लिए:

  • अपने नियंत्रक कार्रवाई में आप User.find के माध्यम से उपयोगकर्ता लोड कर रहे हैं? यानी आप एक वैध मॉडल से शुरू कर रहे हैं।
  • क्या आप वाकई सत्यापन त्रुटियों के कारण अद्यतन विफल हो रहे हैं? update_attributes को update_attributes! के साथ बदलने का प्रयास करें। उत्तरार्द्ध सत्यापन के कारण विफल होने पर उत्तरार्द्ध फेंक देगा। या पुष्टि करने के प्रयास के बाद @user.errors जांचें कि कौन सा सत्यापन विफल हुआ है।

अद्यतन

तो User.find_by_login एक मिलान रिकॉर्ड यह nil वापस आ जाएगी और आप के लिए एक नया रिकॉर्ड बनाने नहीं होगा नहीं मिल रहा है। क्या यह संभव है कि डेटाबेस में उपयोगकर्ता का पासवर्ड है जो बहुत छोटा है? हो सकता है कि उपयोगकर्ता आपके कोड में सत्यापन करने से पहले बनाया गया हो? क्या आप रिकॉर्ड सहेजने से पहले उपयोगकर्ता पासवर्ड एन्क्रिप्ट करने के लिए किसी भी प्रकार की प्लगइन या कॉलबैक का उपयोग कर रहे हैं?password वास्तव में एक वर्चुअल विशेषता है जो सहेजी नहीं गई है और वास्तविक पासवर्ड encrypted_password जैसे फ़ील्ड में है?

script/console से प्रयास करें (एक ही वातावरण आप के साथ अनुप्रयोग का परीक्षण कर रहे के रूप में उपयोग - विकास या उत्पादन)

> user = User.find_by_login 'tester' 
> user.valid? 
> user.attributes 

user.valid?false की true वापस आ जाएगी और आपको बता देंगे उपयोगकर्ता शुरू करने के लिए वैध है या नहीं इससे पहले कि आप एक अद्यतन भी कोशिश करें।

अद्यतन 2 (मान्यता फिक्सिंग)

अपने खुद के कोड फिक्सिंग के मामले में, आप अपने User मॉडल के लिए निम्नलिखित की तरह एक विधि जोड़ सकते हैं:

def password_validation_required? 
    hashed_password.blank? || [email protected]? 
end 

और फिर अद्यतन आपके सभी पासवर्ड से संबंधित सत्यापन नियम ताकि वे केवल तभी लागू हों जब यह विधि true जैसे

validates_length_of :password, :within => 5..20, 
    :if => :password_validation_required? 

क्या यह कह रहा है कि अगर हम अभी तक एक hashed_password (उदाहरण के लिए एक नया उपयोगकर्ता पर) की जरूरत नहीं है केवल पासवर्ड सत्यापन नियम कर रहा है या अगर एक नया सादा पाठ पासवर्ड password= के माध्यम से निर्दिष्ट किया गया है। यदि उपयोगकर्ता के पास पहले से ही एक पासवर्ड है और इसे अपरिवर्तित छोड़ दिया जा रहा है तो पासवर्ड सत्यापन छोड़ दें।

हालांकि आप प्लगइन का उपयोग करने पर विचार करने का अधिकार रखते हैं। अपना खुद का प्रमाणीकरण कोड लिखना एक दिलचस्प व्यायाम हो सकता है और यदि आपके पास कुछ असामान्य आवश्यकताएं हैं तो इसकी आवश्यकता हो सकती है। नीचे की तरफ यह है कि ऐसे सुरक्षा मुद्दे हो सकते हैं जिनके बारे में आपने सोचा नहीं है। अपने ऐप में restful_authentication जैसे कुछ को पुनः लोड करना बहुत बुरा नहीं होना चाहिए। आपको अपने User मॉडल पर केवल एक या दो फ़ील्ड का नाम बदलने की आवश्यकता हो सकती है।

+0

ठीक है, मैंने अभी भी मूल पोस्ट को जो मैंने कोशिश की है उसके परिणामों के साथ अपडेट किया है। और ओह, जब मैंने फ्लैश डिस्प्ले '@users के साथ' update_attributes' किया था। त्रुटियों ', मुझे फ्लैश में '#' मिला, और वह था। जो मुझे आश्चर्यचकित करता है कि यह वास्तव में अद्यतन का मुद्दा है जहां 'id = tester' ... –

+0

@ Jty.tan उत्तर कुछ और के साथ अपडेट किया गया सुझाव दें। अगर उनमें से कोई भी मदद करता है तो मुझे बताएं। – mikej

+0

ओह। आप सही हैं ... मैंने 'यू.वालिद' किया था और 'झूठी वापसी' मिली। हम्म ... मैंने अभी हालिया उपयोगकर्ता के साथ प्रयास किया कि मैंने बनाया (सफलतापूर्वक), और मुझे 'वैध' के लिए भी झूठी वापसी मिली ... तो यह मेरे उपयोगकर्ता मॉडल और सत्यापन के साथ एक मुद्दा है? हां, मेरा उपयोगकर्ता पासवर्ड एन्क्रिप्ट किया गया है, और एन्क्रिप्टेड पासवर्ड वह है जो सहेजा गया है ... मैं अपने उपयोगकर्ता से प्रमाणीकरण के साथ फिर से अपडेट करूंगा। आरबी। –

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