ruby on rails - RoR 4 में सत्यापन के साथ नियमित अभिव्यक्तियां




ruby-on-rails activerecord (4)

निम्नलिखित कोड है:

class Product < ActiveRecord::Base
  validates :title, :description, :image_url, presence: true
  validates :price, numericality: {greater_than_or_equal_to: 0.01}
  validates :title, uniqueness: true
  validates :image_url, allow_blank: true, format: {
      with: %r{\.(gif|jpg|png)$}i,
      message: 'URL must point to GIT/JPG/PNG pictures'
  }
end

यह काम करता है, लेकिन जब मैं इसे "रेक टेस्ट" का उपयोग करके परीक्षण करने का प्रयास करता हूं तो मुझे यह संदेश मिल जाएगा:

rake aborted!
The provided regular expression is using multiline anchors (^ or $), which may present a security risk. Did you mean to use \A and \z, or forgot to add the :multiline => true option?

इसका क्या मतलब है? मेरे द्वारा यह कैसे किया जा सकता है?


चेतावनी आपको बता रही है कि निम्नलिखित की तरह तारों को सत्यापन पास होगा, लेकिन शायद यह नहीं है कि आप क्या चाहते हैं:

test = "image.gif\nthis is not an image"
re = /\.(gif|jpg|png)$/i
re.match(test) #=> #<MatchData ".gif" 1:"gif">

^ और $ दोनों किसी भी पंक्ति के प्रारंभ / अंत से मेल खाते हैं, स्ट्रिंग की शुरुआत / अंत नहीं। \A और \z क्रमशः पूर्ण स्ट्रिंग की शुरुआत और अंत से मेल खाता है।

re = /\.(gif|jpg|png)\z/i
re.match(test) #=> nil

चेतावनी का दूसरा भाग ("या मल्टीलाइन => सच्चा विकल्प जोड़ने के लिए भूल गया") आपको बता रहा है कि यदि आप वास्तव में ^ और $ के व्यवहार को चाहते हैं तो आप आसानी से गुजरने वाली चेतावनी को चुप कर सकते हैं :multiline विकल्प।


यदि रूबी सुरक्षा के लिए $ प्रतीक चिह्न के बजाय \z देखना चाहता है, तो आपको उसे उसे देना होगा, फिर कोड इस तरह दिखेगा:

validates :image_url, allow_blank: true, format: {with: %r{\.(gif|jpg|png)\z}i, message: 'URL must point to GIF, JPG, PNG.'}

समस्या regexp तैयार नहीं है, बल्कि कॉन्फ़िगर / प्रारंभकर्ता / devise.rb में रहता है। परिवर्तन:

# Regex to use to validate the email address
config.email_regexp = /^([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})$/i

सेवा मेरे:

# Regex to use to validate the email address
  config.email_regexp = /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\Z/i

^ और $ लाइन ऑफ स्टार्ट ऑफ़ लाइन एंड एंड लाइन लाइन एंकर हैं। जबकि \A और \z स्ट्रिंग एंकरों के स्ट्रिंग और एंड के स्थायी प्रारंभ हैं।
फर्क देखें:

string = "abcde\nzzzz"
# => "abcde\nzzzz"

/^abcde$/ === string
# => true

/\Aabcde\z/ === string
# => false

तो रेल आपको बता रहे हैं, "क्या आप वाकई ^ और $ का उपयोग करना चाहते हैं? क्या आप इसके बजाय \A और \z का उपयोग नहीं करना चाहते हैं?"

रेल सुरक्षा सुरक्षा चिंता पर और अधिक है जो इस चेतावनी को here उत्पन्न करता here





activerecord