2010-02-16 8 views
19

मेरे पास एक उपयोगकर्ता मॉडल है, जिसमें एक ईमेल और पासवर्ड फ़ील्ड है। सुरक्षा के लिए, ये एक-दूसरे के बराबर नहीं हो सकते हैं। मैं इसे अपने मॉडल में कैसे परिभाषित कर सकता हूं?मैं कैसे सत्यापित करूं कि दो मान रेल मॉडल में एक दूसरे के बराबर नहीं हैं?

+0

कि अजीब इसलिए बाद में जवाब स्वीकार कर लिया गया है, जबकि दूसरों लगभग समान हैं? –

+0

@Dejw यह सबसे छोटा है जो न केवल –

+0

पर स्पष्टीकरण के लिए धन्यवाद बनाता है।फिर भी क्लेव का जवाब छोटा था ;-) –

उत्तर

23

Create custom validataion:

validate :check_email_and_password 

def check_email_and_password 
    errors.add(:password, "can't be the same as email") if email == password 
end 

लेकिन ध्यान रखें कि एक सादा पाठ के रूप में पासवर्ड भंडारण बुरा विचार है। आपको इसे धोया जाना चाहिए। authlogic या Restful authentication जैसे कुछ प्रमाणीकरण प्लगइन आज़माएं।

class User < ActiveRecord::Base 
    # ... 
    validates_with ValuesNotEqualValidator, fields: [:email, :password], msg: "This Person is evil" 
end 
6

आप इसे जांचने के लिए एक कस्टम सत्यापन विधि का उपयोग कर सकते हैं।

class User < ActiveRecord::Base 
    # ... 

    def validate 
    if (self.email == self.password) 
     errors.add(:password, "password cannot equal email") 
     errors.add(:email, "email cannot equal password") 
    end 
    end 
end 
1

आप सभी की जरूरत उदाहरण के लिए अपने मॉडल में सत्यापन नियम बनाने के लिए है

class User < ActiveRecord::Base 
    def validate_on_create 
    if email == password 
     errors.add("password", "email and password can't be the same") 
    end 
    end 
end 
+1

मुझे नहीं लगता कि यह सही है। हम 'validate' चाहते हैं, 'validate_on_create' नहीं, क्योंकि हमें सभी सहेजने की आवश्यकता है कि ई-मेल पासवर्ड नहीं है (केवल सृजन समय पर नहीं)। –

+0

त्रुटि संदेश में एक वाक्यविन्यास त्रुटि (टाइपो) है: आप स्ट्रिंग में सिंगल कोट अंक का उपयोग नहीं कर सकते हैं जो एकल उद्धृत है ;-) –

4

यह निर्भर करता है कि कैसे आपका पासवर्ड संग्रहीत किया जाता है:

class User < ActiveRecord::Base 
    validate :email_and_password_validation 

    def email_and_password_validation 
     if self.email == self.password 
      errors.add_to_base("Password must be different from email") 
     end 
    end 
end 

यह अगर आपका पासवर्ड है काम करेगा सचमुच संग्रहित है, लेकिन आप ईमेल के साथ एक ही चीज़ कर सकते हैं (उदाहरण के लिए एक हैश संस्करण बनाएं) और पासवर्ड के साथ समानता की जांच करें। उदा:

class User < ActiveRecord::Base 
    validate :email_and_password_validation 

    def email_and_password_validation 
     if make_hash(self.email) == self.hashed_password 
      errors.add_to_base("Password must be different from email") 
     end 
    end 
end 

मेरे उदाहरण http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M002162

आपका स्थिति से लिया जाता है काफी सामान्य है, तो आप कस्टम सत्यापन विधि बनाने में रुचि हो सकती है। यहाँ सब कुछ कवर किया जाता है: http://guides.rubyonrails.org/active_record_validations_callbacks.html#creating-custom-validation-methods

+0

अंतिम लिंक 404 – Rekin

+0

फिक्स्ड लिंक (रेल गाइड के पुराने संस्करण से लिया गया) देता है। धन्यवाद। –

4

यह कस्टम सत्यापनकर्ता उपयोग करने के लिए बहुत समझदार है, यहाँ कि

class ValuesNotEqualValidator < ActiveModel::Validator 
    def validate(record) 
    if options[:fields].any? && options[:fields].size >= 2 
     field_values = options[:fields].collect { |f| record.send(f) } 
     unless field_values.size == field_values.uniq.size 
     record.errors[:base] << 
      (options[:msg].blank? ? "fields: #{options[:fields].join(", ")} - should not be equal" : 
       options[:msg]) 
     end 
    else 
     raise "#{self.class.name} require at least two fields as options [e.g. fields: [:giver_id, :receiver_id]" 
    end 
    end 
end 

इस्तेमाल किया जा सकता है और फिर इसे पसंद का उपयोग सार्वभौमिक सत्यापनकर्ता के लिए कोड है , आपको एक और समाधान के साथ आना होगा, जो त्रुटि संदेशों और विशेषता नामों का अनुवाद करता है। तो मैंने इसके लिए एक नया सत्यापनकर्ता बनाया।

validators/values_not_equal_validator.rb:
class ValuesNotEqualValidator < ActiveModel::EachValidator 
    def validate(record) 
    @past = Hash.new 
    super 
    end 

    def validate_each(record, attribute, value) 
    @past.each do |k, v| 
     if v == value 
     record.errors.add(attribute, I18n.t('errors.messages.should_not_be_equal_to') + " " + record.class.human_attribute_name(k)) 
     end 
    end 
    @past[attribute] = value 
    end 
end 

मैं इस तरह के मॉडल में इसे कहते:

class User < ActiveRecord::Base 
    validates :forename, :surname, values_not_equal: true 
end 

और मैं इसे इस तरह संदेशों का अनुवाद:

de: 
    activerecord: 
    attributes: 
     user: 
     forename: 'Vorname' 
     surname: 'Nachname' 
    errors: 
    messages: 
     should_not_be_equal_to: 'darf nicht gleich sein wie' 
0

आप एकाधिक भाषाओं का समर्थन करना चाहते हैं:

4

नया तरीका:

validates :password, exclusion: { in: lambda{ |user| [user.email] } } 

या:

validates :password, exclusion: { in: ->(user) { [user.email] } } 
+0

PLease स्पष्ट करें कि "नया तरीका" से आपका क्या मतलब है। यह किस रूबी/रेल लागू है? – oklas

+0

यह कम से कम रेल 3.2.22/रूबी 2.2.6 - उत्कृष्ट लघु समाधान से काम किया। धन्यवाद। – oklas

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