2011-08-23 12 views
5

मैं अपने उपयोगकर्ता मॉडल में निम्नलिखितसत्यापित करें और अद्यतन एक विशेषता

attr_accessible :avatar, :email 

validates_presence_of :email 
has_attached_file :avatar # paperclip 

validates_attachment_size :avatar, 
          :less_than => 1.megabyte, 
          :message => 'Image cannot be larger than 1MB in size', 
          :if => Proc.new { |imports| !imports.avatar_file_name.blank? } 
मेरी नियंत्रकों में से एक में

, मैं केवल अद्यतन करें और अद्यतन करने और ईमेल मान्य बिना अवतार क्षेत्र मान्य करने के लिए करना चाहते हैं रेल।

मैं यह कैसे कर सकता हूं?

उदाहरण के लिए

(यह काम नहीं करेगा)

if @user.update_attributes(params[:user]) 
# do something... 
end 

मैं भी update_attribute('avatar', params[:user][:avatar]) साथ करने की कोशिश की, लेकिन वह अवतार क्षेत्र के लिए सत्यापन के साथ-साथ छोड़ जाएगा।

+1

डुप्लिकेट? http://stackoverflow.com/questions/457239/is-there-a-way-to- validate-a- विशिष्ट-attribute-on-an-activerecord-without-instan/457313#457313 –

+0

नहीं, मुझे लगता है कि 'नकली । वैध? 'सबकुछ मान्य करता है। मैं केवल एक विशेषता को प्रमाणित करना चाहता हूं। – Madhusudhan

उत्तर

13

आप validate the attribute by hand कर सकते हैं और update_attribute का उपयोग कर सकते हैं, skips validation। आप this to your User जोड़ते हैं:

def self.valid_attribute?(attr, value) 
    mock = self.new(attr => value) 
    if mock.valid? 
    true 
    else 
    !mock.errors.has_key?(attr) 
    end 
end 

और फिर thusly विशेषता को अपडेट:

if(!User.valid_attribute?('avatar', params[:user][:avatar]) 
    # Complain or whatever. 
end 
@user.update_attribute('avatar', params[:user][:avatar]) 

आप अपने एकल विशेषता अपडेट कर दिया जाना चाहिए, जबकि केवल (स्वयं) उस गुण को मान्य।

यदि आप मिलान नोवाटा के valid_attribute? काम करते हैं, तो आप देखेंगे कि यह सत्यापन करता है और फिर यह देखने के लिए जांच करता है कि विशिष्ट attr में समस्याएं थीं; इससे कोई फर्क नहीं पड़ता कि valid_attribute? के रूप में अन्य मान्यताओं में से कोई भी विफलता केवल उस विशेषता के लिए सत्यापन विफलताओं को देखता है जिसमें आप रुचि रखते हैं।

यदि आप बहुत सारी चीज़ें कर रहे हैं तो आप कर सकते हैं उपयोगकर्ता को एक विधि जोड़ें:

def update_just_this_one(attr, value) 
    raise "Bad #{attr}" if(!User.valid_attribute?(attr, value)) 
    self.update_attribute(attr, value) 
end 

और अपनी एकल विशेषता को अपडेट करने के लिए इसका उपयोग करें।

+0

यह ईमेल सत्यापन के लिए भी जांच करेगा, बस अवतार नहीं। – Madhusudhan

+0

@Madhusudhan: आप हाथ से सत्यापन सेट अप कर सकते हैं और 'update_attribute' का उपयोग कर सकते हैं। कृपया मेरा अपडेट देखें। –

+0

युप जिसने मदद की! धन्यवाद! – Madhusudhan

1

क्या आपने validates_presence_of :email पर कोई शर्त डालने का प्रयास किया है?

http://ar.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M000083

कॉन्फ़िगरेशन विकल्प:

अगर - एक विधि प्रोक या स्ट्रिंग निर्दिष्ट करता है, तो सत्यापन होने चाहिए निर्धारित करने के लिए कॉल करने के लिए (जैसे: अगर =>: allow_validation, या: अगर => Proc.new {| user | user.signup_step> 2})। विधि, proc या स्ट्रिंग को एक वास्तविक या गलत मान पर वापस या मूल्यांकन करना चाहिए।

जब तक - वैधता नहीं होनी चाहिए (उदाहरण के लिए: जब तक =>: skip_validation, या: जब तक => Proc.new {| user | user.signup_step < = 2 })। विधि, proc या स्ट्रिंग को एक वास्तविक या गलत मान पर वापस या मूल्यांकन करना चाहिए।

1

मैं यह सोचते हैं रहा हूँ आप इस की जरूरत है, क्योंकि आप एक बहु कदम जादूगर है, जहां आप पहले अवतार और ई-मेल बाद में भर जाता है अपलोड की है।

मेरे ज्ञान के अनुसार, आपके सत्यापन के साथ, मुझे कोई अच्छा कामकाजी समाधान नहीं दिख रहा है। या तो आप सभी को मान्य करते हैं, या आप अवतार के बिना अवतार अपडेट करते हैं।यदि यह एक साधारण विशेषता होगी, तो आप जांच सकते हैं कि नया मान सत्यापन को अलग से पास करता है, और उसके बाद सत्यापन के बिना मॉडल अपडेट करें (उदाहरण के लिए update_attribute का उपयोग करना)।

मैं दो संभावित वैकल्पिक तरीकों का सुझाव कर सकते हैं:

  • या तो आप जो मेरा मानना ​​है कि एक बुरा समाधान नहीं है यह सुनिश्चित करें कि ई-मेल हमेशा पहले दर्ज किया गया है सुनिश्चित करें। और फिर, प्रत्येक सेव के साथ, सत्यापन पूरा हो जाता है।
  • अन्यथा, सत्यापन बदलें। यदि डेटाबेस में ऐसे रिकॉर्ड हैं जो सत्यापन को पूरा नहीं करते हैं, तो आप मॉडल पर सत्यापन क्यों घोषित करेंगे? यह बहुत उलझन में है।

    validate :presence_of_email_after_upload_avatar 
    
    def presence_of_email_after_upload_avatar 
        # write some test, when the email should be present 
        if avatar.present? 
        errors.add(:email, "Email is required") unless email.present? 
        end 
    end 
    

    आशा इस मदद करता है:

तो मैं कुछ इस तरह का प्रस्ताव होगा।

+0

error.add (: ईमेल, "ईमेल आवश्यक है") त्रुटि उत्पन्न करता है = "ईमेल ईमेल आवश्यक है"। केवल "आवश्यक है" के लिए "ईमेल आवश्यक है" बदलें –

6

एक शर्त?

validates_presence_of :email, :if => :email_changed? 
1

मेरा समाधान यहां है। यह से समान व्यवहार रखता है। वैध? विधि, चुड़ैल सच या गलत लौटाता है, और इसे चुड़ैल पर मॉडल पर त्रुटियों को जोड़ता है।

class MyModel < ActiveRecord::Base 
    def valid_attributes?(attributes) 
    mock = self.class.new(self.attributes) 
    mock.valid? 
    mock.errors.to_hash.select { |attribute| attributes.include? attribute }.each do |error_key, error_messages| 
     error_messages.each do |error_message| 
     self.errors.add(error_key, error_message) 
     end 
    end 

    self.errors.to_hash.empty? 
    end 
end 

> my_model.valid_attributes? [:first_name, :email] # => returns true if first_name and email is valid, returns false if at least one is not valid 
> my_modal.errors.messages # => now contain errors of the previous validation 
{'first_name' => ["can't be blank"]} 
संबंधित मुद्दे