ruby on rails - क्या किसी ऑब्जेक्ट को बिना किसी ऑब्जेक्ट को तत्काल निष्पादित किए एक विशेष एट्रिब्यूट को मान्य करने का एक तरीका है?




ruby-on-rails validation (6)

'मान्य_डेटाट' विधि का एक कार्यान्वयन जो आप सुझाव दे रहे हैं:

class ActiveRecord:Base
  def self.valid_attribute?(attribute, value)
    instance = new
    instance[attribute] = value
    instance.valid?

    list_of_errors = instance.errors.instance_variable_get('@errors')[attribute]

    list_of_errors && list_of_errors.size == 0
  end
end

उदाहरण के लिए, अगर मेरे पास एक यूजर मॉडल है और मुझे केवल लॉग-इन को मान्य करने की आवश्यकता है (जो कि एजेक्स के माध्यम से फ़ॉर्म को मान्य करते समय हो सकता है), यह अच्छा होगा अगर मैं उपयोगकर्ता मॉडल में परिभाषित एक ही मॉडल मान्यताओं का प्रयोग करता हूं जो वास्तव में यूज़र इंस्टेंस ।

तो नियंत्रक में मैं कोड लिखने में सक्षम हूं

User.valid_attribute?(:login, "login value")

क्या कोई और तरीका है इसे करने के लिए?


अपने मानक सत्यापन दिनचर्या का उपयोग करने के लिए:


User.new(:login => 'login_value').valid?

यदि वह आपके लिए काम नहीं करता है, तो इसके लिए कस्टम क्लास विधि बनाएं:


class User < ActiveRecord::Base

  validate do |user|
    user.errors.add('existing') unless User.valid_login?(user.login)
  end

  def self.valid_login?(login)
    # your validation here
    !User.exist?(:login=> login)
  end
end

मैं कस्टम वर्ग के समाधान के साथ गया हूं, लेकिन मैं यह सुनिश्चित करना चाहता हूं कि कोई बेहतर तरीका नहीं है

class ModelValidator
  def self.validate_atrribute(klass, attribute, value)
    obj = Klass.new
    obj.send("#{attribute}=", value)
    obj.valid?
    errors = obj.errors.on(attribute).to_a
    return (errors.length > 0), errors 
  end
end

और मैं इसका इस्तेमाल कर सकता हूँ

मान्य, त्रुटियाँ = मॉडलवैद्येटर.विधिकृत_अटिब्यूट (उपयोगकर्ता, "लॉगिन", "इंसान")


class User < ActiveRecord::Base
  validates_each :login do |record, attr, value|
    record.errors.add attr, 'error message here' unless User.valid_login?(value)
  end

  def self.valid_login?(login)
    # do validation
  end
end

बस यूजर। Valid_login पर कॉल करें? (लॉगिन) यह देखने के लिए कि लॉगिन स्वयं मान्य है


आपके सुझाव के लिए मिलान का धन्यवाद। इसके द्वारा प्रेरित होकर मैंने एक साधारण मॉड्यूल बनाया जो किसी भी वर्ग को इस कार्यक्षमता को जोड़ने के लिए उपयोग कर सकता है। नोट करें कि मूल मिल्लन के सुझाव के रूप में एक तर्क त्रुटि है:

return mock.errors.has_key?(attr)

स्पष्ट रूप से होना चाहिए:

return (not mock.errors.has_key?(attr))

मैंने अपने समाधान का परीक्षण किया है और इसे काम करना चाहिए, लेकिन ओसीसी मैं कोई गारंटी नहीं देता और यहाँ मेरा गौरवपूर्ण समाधान है मूल रूप से एक 2-लाइनर यदि आप मॉड्यूल सामान लेते हैं .. यह विधि नामों को डंक या प्रतीकों के रूप में स्वीकार करता है।

module SingleAttributeValidation

  def self.included(klass)
    klass.extend(ClassMethods)
  end

  module ClassMethods
    def valid_attribute?(attr, value)
      mock = self.new(attr => value)
      (not mock.valid?) && (not mock.errors.has_key?(attr.class == Symbol ? attr : attr.to_sym))
    end
  end
end

मुझे पटरियों 3.1 में काम करने के लिए यह एक समय का एक नरक था। यह अंत में काम किया (यह सुनिश्चित करने के लिए कि यह क्या करने का सबसे अच्छा तरीका है, मैं एक नई तरह का हूँ)। मुझे समस्या यह थी कि यह मूल्य ActiveSupport :: SafeBuffer टाइप करने के लिए सेट किया गया था, और सत्यापन विफल रहा था।

def self.valid_attribute?(attr, value)
  mock = User.new(attr => "#{value}") # Rails3 SafeBuffer messes up validation
  unless mock.valid?
    return (not mock.errors.messages.has_key?(attr))
  end
  return true
end




activerecord