রেলস: লিঙ্কগুলি (ইউআরএল) যাচাই করার ভাল উপায় কী?


125

আমি ভাবছিলাম কীভাবে আমি রেলগুলিতে ইউআরএলকে সর্বোত্তমভাবে প্রমাণ করব। আমি একটি নিয়মিত এক্সপ্রেশন ব্যবহার করার কথা ভাবছিলাম, তবে নিশ্চিত নই যে এটি সর্বোত্তম অনুশীলন কিনা।

এবং, যদি আমি একটি রেজেক্স ব্যবহার করি তবে কেউ কি আমাকে একটি প্রস্তাব দিতে পারে? আমি এখনও রেগেক্সে নতুন।


উত্তর:


151

একটি ইউআরএল যাচাই করা একটি জটিল কাজ is এটি একটি খুব বিস্তৃত অনুরোধ।

আপনি ঠিক কি করতে চান? আপনি কি ইউআরএল, অস্তিত্ব বা কিসের বিন্যাসটি বৈধ করতে চান? আপনি যা করতে চান তার উপর নির্ভর করে বিভিন্ন সম্ভাবনা রয়েছে।

একটি নিয়মিত প্রকাশটি ইউআরএলের ফর্ম্যাটটিকে বৈধতা দিতে পারে। তবে একটি জটিল নিয়মিত অভিব্যক্তিও আপনি বৈধ ইউআরএল নিয়ে কাজ করছেন তা নিশ্চিত করতে পারে না।

উদাহরণস্বরূপ, আপনি যদি একটি সাধারণ নিয়মিত অভিব্যক্তি গ্রহণ করেন তবে এটি সম্ভবত নিম্নলিখিত হোস্টটিকে প্রত্যাখ্যান করবে

http://invalid##host.com

কিন্তু এটি অনুমতি দেবে

http://invalid-host.foo

এটি একটি বৈধ হোস্ট, তবে বৈধ ডোমেন নয় যদি আপনি বিদ্যমান টিএলডি বিবেচনা করেন। প্রকৃতপক্ষে, সমাধানটি কাজ করবে যদি আপনি হোস্টনামটি বৈধ করতে চান, ডোমেন নয় কারণ নিম্নলিখিতটি একটি বৈধ হোস্টনেম

http://host.foo

পাশাপাশি নিম্নলিখিতটি

http://localhost

এখন, আমি আপনাকে কিছু সমাধান দেই।

আপনি যদি কোনও ডোমেইন যাচাই করতে চান তবে আপনাকে নিয়মিত প্রকাশের কথা ভুলে যাওয়া দরকার। এই মুহুর্তে সর্বোত্তম সমাধানটি হ'ল পাবলিক প্রত্যয় তালিকা, মজিলার দ্বারা রক্ষণাবেক্ষণ করা একটি তালিকা। আমি পাবলিক প্রত্যয় তালিকার বিপরীতে ডোমেনগুলি বিশ্লেষণ ও বৈধ করতে একটি রুবি গ্রন্থাগার তৈরি করেছি এবং এটিকে পাবলিকসফিক্স বলে

আপনি যদি কোনও ইউআরআই / ইউআরএলের ফর্ম্যাটটি বৈধতা দিতে চান তবে আপনি নিয়মিত ভাব প্রকাশ করতে চাইতে পারেন। এর জন্য অনুসন্ধানের পরিবর্তে বিল্ট-ইন রুবি URI.parseপদ্ধতিটি ব্যবহার করুন ।

require 'uri'

def valid_url?(uri)
  uri = URI.parse(uri) && !uri.host.nil?
rescue URI::InvalidURIError
  false
end

এমনকি আপনি এটিকে আরও সীমাবদ্ধ করার সিদ্ধান্ত নিতে পারেন। উদাহরণস্বরূপ, আপনি যদি URL টি এইচটিটিপি / এইচটিটিপিএস URL হতে চান তবে আপনি বৈধতাটিকে আরও নির্ভুল করে তুলতে পারেন।

require 'uri'

def valid_url?(url)
  uri = URI.parse(url)
  uri.is_a?(URI::HTTP) && !uri.host.nil?
rescue URI::InvalidURIError
  false
end

অবশ্যই, আপনি এই পদ্ধতিতে প্রয়োগ করতে পারেন এমন অনেকগুলি উন্নতি রয়েছে, যার মধ্যে কোনও পথ বা স্কিম পরীক্ষা করা রয়েছে।

সর্বশেষে তবে সর্বনিম্ন নয়, আপনি এই কোডটিকে কোনও বৈধকরণকারী হিসাবেও প্যাকেজ করতে পারেন:

class HttpUrlValidator < ActiveModel::EachValidator

  def self.compliant?(value)
    uri = URI.parse(value)
    uri.is_a?(URI::HTTP) && !uri.host.nil?
  rescue URI::InvalidURIError
    false
  end

  def validate_each(record, attribute, value)
    unless value.present? && self.class.compliant?(value)
      record.errors.add(attribute, "is not a valid HTTP URL")
    end
  end

end

# in the model
validates :example_attribute, http_url: true

1
ক্লাস হবে তা নোট করুন URI::HTTPS https uris এর জন্য (উদা:URI.parse("https://yo.com").class => URI::HTTPS
টি

12
URI::HTTPSউত্তরাধিকার সূত্রে URI:HTTP, এই কারণেই আমি ব্যবহার করি kind_of?
সিমোন কার্লেটি

1
কোনও ইউআরএল নিরাপদে বৈধ করার সবচেয়ে সম্পূর্ণ সমাধান।
ফ্যাবরিজিও রেগিনি

4
URI.parse('http://invalid-host.foo')সত্য প্রত্যাবর্তন করে কারণ ইউআরআই একটি বৈধ URL। এছাড়াও নোট করুন যে .fooএখন একটি বৈধ টিএলডি। iana.org/domains/root/db/foo.html
সিমোন কার্লেটি

1
@jmcartie দয়া করে পুরো পোস্টটি পড়ুন। যদি আপনি এই প্রকল্পটির বিষয়ে চিন্তা করেন তবে আপনার অবশ্যই চূড়ান্ত কোডটি ব্যবহার করা উচিত যা এতে কেবল লাইনটি নয়, একটি প্রকার চেক অন্তর্ভুক্ত রয়েছে। আপনি পোস্ট শেষ হওয়ার আগে পড়া বন্ধ করেছেন।
সিমোন কার্লেটি

101

আমি আমার মডেলগুলির মধ্যে একটি লাইন ব্যবহার করি:

validates :url, format: URI::regexp(%w[http https])

আমি মনে করি যথেষ্ট ভাল এবং ব্যবহার করা সহজ। তাছাড়া এটি তাত্ত্বিকভাবে সিমোন পদ্ধতির সমতুল্য হওয়া উচিত, কারণ এটি অভ্যন্তরীণভাবে খুব একই রেজিপ্সপ ব্যবহার করে।


17
দুর্ভাগ্যক্রমে 'http://'উপরের প্যাটার্নটির সাথে মেলে। দেখুন:URI::regexp(%w(http https)) =~ 'http://'
ডেভিড জে

15
এছাড়াও একটি ইউআরএল http:fakeবৈধ হবে।
নাথানভদা

54

সিমোনের ধারণা অনুসরণ করে আপনি সহজেই নিজের স্বীকৃতি প্রদানকারী তৈরি করতে পারেন।

class UrlValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    return if value.blank?
    begin
      uri = URI.parse(value)
      resp = uri.kind_of?(URI::HTTP)
    rescue URI::InvalidURIError
      resp = false
    end
    unless resp == true
      record.errors[attribute] << (options[:message] || "is not an url")
    end
  end
end

এবং তারপরে ব্যবহার করুন

validates :url, :presence => true, :url => true

আপনার মডেল


1
আমি এই ক্লাস কোথায় রাখা উচিত? ইনিশিয়ালাইজারে?
দেব

3
আমি @ জিবিসি-এর উদ্ধৃতি দিয়েছি: "আপনি যদি অ্যাপ্লিকেশন / ভ্যালিডেটরে আপনার কাস্টম ভ্যালিডিটার রাখেন তবে সেগুলি আপনার কনফিগারেশন / অ্যাপ্লিকেশন.আরবি ফাইল পরিবর্তন করার প্রয়োজন ছাড়াই স্বয়ংক্রিয়ভাবে লোড হবে will" ( স্ট্যাকওভারফ্লো . com / a / 6610270 / 839847 )। নোট করুন যে স্টেফান পিটারসন এর নীচের উত্তর থেকে বোঝা যাচ্ছে যে তিনি "অ্যাপ / বৈধকারক" তেও অনুরূপ একটি ফাইল সংরক্ষণ করেছিলেন।
bergie3000

4
ইউআরএলটি http: // বা https: // দিয়ে শুরু হয় কিনা তা কেবল এটি পরীক্ষা করে, এটি কোনও সঠিক ইউআরএল বৈধতা নয়
ম্যাজিক্স

1
আপনি যদি ইউআরএলটিকে alচ্ছিক হিসাবে বহন করতে পারেন তবে শেষ করুন: শ্রেণি ptionচ্ছিক ইউরালভালিডেটর <উরালভালিডেটর ডিএফ ভ্যালিডেট_ইচ (রেকর্ড, বৈশিষ্ট্য, মান) মান.ব্ল্যাঙ্ক হলে সত্য ফিরে আসে? সুপার শেষ
ডার্টি হেনরি

1
এটি একটি ভাল বৈধতা নয়:URI("http:").kind_of?(URI::HTTP) #=> true
স্মার্ট

28

এখানে ভ্যালিড_আরল রত্ন (যা সমাধানের জন্য কেবল একটি দুর্দান্ত মোড়ক Addressable::URI.parse)।

শুধু যোগ কর

gem 'validate_url'

আপনার Gemfile, এবং তারপরে মডেলগুলিতে আপনি পারেন

validates :click_through_url, url: true

@। এটি ঠিক তেমনি হতে পারে কারণ অনুমান অনুসারে এটি বৈধ, তবে আপনি github.com/sporkmonger/addressable/issues চেক করতে চাইতে পারেন । এছাড়াও সাধারণ ক্ষেত্রে আমরা দেখতে পেয়েছি যে কেউ মানক অনুসরণ করে না এবং পরিবর্তে সাধারণ বিন্যাসের বৈধতা ব্যবহার করছে।
ডলজনকো

13

এই প্রশ্নের ইতিমধ্যে উত্তর দেওয়া হয়েছে, কিন্তু হ্যাক কী, আমি সমাধানটি আমি ব্যবহার করছি বলে প্রস্তাব করছি।

আমি যে সকল url গুলির সাথে দেখা হয়েছি তার সাথে রেজিপেক্স সূক্ষ্মভাবে কাজ করে। সেটার পদ্ধতিটি হ'ল কোনও প্রোটোকল উল্লেখ না করা থাকলে যত্ন নেওয়া (আসুন http: // ধরে নেওয়া যাক)।

এবং পরিশেষে, আমরা পৃষ্ঠাটি আনার চেষ্টা করি। হয়তো আমার পুনঃনির্দেশগুলি গ্রহণ করা উচিত এবং কেবল এইচটিটিপি 200 ঠিক আছে না।

# app/models/my_model.rb
validates :website, :allow_blank => true, :uri => { :format => /(^$)|(^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$)/ix }

def website= url_str
  unless url_str.blank?
    unless url_str.split(':')[0] == 'http' || url_str.split(':')[0] == 'https'
        url_str = "http://" + url_str
    end
  end  
  write_attribute :website, url_str
end

এবং...

# app/validators/uri_vaidator.rb
require 'net/http'

# Thanks Ilya! http://www.igvita.com/2006/09/07/validating-url-in-ruby-on-rails/
# Original credits: http://blog.inquirylabs.com/2006/04/13/simple-uri-validation/
# HTTP Codes: http://www.ruby-doc.org/stdlib/libdoc/net/http/rdoc/classes/Net/HTTPResponse.html

class UriValidator < ActiveModel::EachValidator
  def validate_each(object, attribute, value)
    raise(ArgumentError, "A regular expression must be supplied as the :format option of the options hash") unless options[:format].nil? or options[:format].is_a?(Regexp)
    configuration = { :message => I18n.t('errors.events.invalid_url'), :format => URI::regexp(%w(http https)) }
    configuration.update(options)

    if value =~ configuration[:format]
      begin # check header response
        case Net::HTTP.get_response(URI.parse(value))
          when Net::HTTPSuccess then true
          else object.errors.add(attribute, configuration[:message]) and false
        end
      rescue # Recover on DNS failures..
        object.errors.add(attribute, configuration[:message]) and false
      end
    else
      object.errors.add(attribute, configuration[:message]) and false
    end
  end
end

সত্যিই ঝরঝরে! আপনার ইনপুট জন্য ধন্যবাদ, একটি সমস্যা প্রায়শই অনেক পন্থা আছে; লোকেরা তাদের ভাগ করে নিলে এটি দুর্দান্ত।
জায়ে

6
কেবল উল্লেখ করতে চেয়েছিলাম যে রেল সুরক্ষা গাইড অনুযায়ী আপনার সেই রিজেক্সেপে \ rather এর পরিবর্তে \ এ এবং \ জেড ব্যবহার করা উচিত
জ্যারেড

1
আমি এটা পছন্দ করি. কোডটিকে কিছুটা শুকিয়ে দেওয়ার জন্য দ্রুত পরামর্শটি রেগেক্সকে বৈধকারীর কাছে নিয়ে গিয়ে, যেমনটি আমি ধারণা করি আপনি এটি মডেলগুলির মধ্যে সামঞ্জস্যপূর্ণ থাকতে চান। বোনাস: এটি আপনাকে বৈধতা_ইচের আওতায় প্রথম লাইন ছাড়ার অনুমতি দেবে।
পল পেটেনগিল

যদি ইউআরএল দীর্ঘ এবং সময়সীমা গ্রহণ করে? টাইমআউট ত্রুটি বার্তাটি দেখানোর জন্য বা পৃষ্ঠাটি খুলতে না পারলে সেরা বিকল্পটি কী হবে?
ব্যবহারকারী588324

এটি কখনই কোনও সুরক্ষা নিরীক্ষণ পাস করবে না, আপনি আপনার সার্ভারগুলিকে একটি স্বেচ্ছাসেবী ইউআরএল তৈরি করছেন
মরিসিও

12

আপনি বৈধ_আরল রত্নও চেষ্টা করতে পারেন যা স্কিম ছাড়াই ইউআরএলকে মঞ্জুরি দেয়, ডোমেন অঞ্চল এবং আইপি-হোস্টনাম পরীক্ষা করে।

এটি আপনার জেমফাইলে যুক্ত করুন:

gem 'valid_url'

এবং তারপরে মডেলটিতে:

class WebSite < ActiveRecord::Base
  validates :url, :url => true
end

এটি এত দুর্দান্ত, বিশেষত স্কিমবিহীন ইউআরএলগুলি, যা আশ্চর্যজনকভাবে ইউআরআই শ্রেণির সাথে জড়িত।
পল পেটেনগিল

আইপি-ভিত্তিক ইউআরএলগুলি আবিষ্কার করার এবং বোগাসগুলি সনাক্ত করার জন্য এই রত্নটির দক্ষতা দেখে আমি অবাক হয়েছি। ধন্যবাদ!
হিজ অফ ওজ

10

শুধু আমার 2 সেন্ট:

before_validation :format_website
validate :website_validator

private

def format_website
  self.website = "http://#{self.website}" unless self.website[/^https?/]
end

def website_validator
  errors[:website] << I18n.t("activerecord.errors.messages.invalid") unless website_valid?
end

def website_valid?
  !!website.match(/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-=\?]*)*\/?$/)
end

সম্পাদনা: প্যারামিটার ইউআরএলগুলির সাথে মেলে রেক্স পরিবর্তন করেছে।


1
আপনার ইনপুট জন্য ধন্যবাদ, সবসময় বিভিন্ন সমাধান দেখতে ভাল
jay

বিটিডব্লিউ, আপনার http://test.com/fdsfsdf?a=b
রেজিএক্সপ্যাক্স

2
আমরা এই কোডটিকে উত্পাদনে রেখেছি এবং ম্যাচ রেজেজ লাইনে অসীম লুপগুলিতে টাইমআউট পেতে থাকি। নিশ্চিত না কেন, কিছু কর্নারকেস সম্পর্কে কেবল সতর্কতা এবং কেন এটি ঘটবে সে সম্পর্কে অন্যের মতামত শুনতে আগ্রহী।
টুবুলকেহে

10

আমার পক্ষে যে সমাধানটি কাজ করেছিল তা হ'ল:

validates_format_of :url, :with => /\A(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w\.-]*)*\/?\Z/i

আপনি সংযুক্ত উদাহরণটি ব্যবহার করার চেষ্টা করেছি তবে আমি ইউআরএলকে সমর্থন করছি:

এ এবং জেডের ব্যবহারটি লক্ষ্য করুন কারণ আপনি যদি ^ এবং use ব্যবহার করেন তবে আপনি রেল যাচাইকারীদের এই সতর্কতা সুরক্ষাটি দেখতে পাবেন।

 Valid ones:
 'www.crowdint.com'
 'crowdint.com'
 'http://crowdint.com'
 'http://www.crowdint.com'

 Invalid ones:
  'http://www.crowdint. com'
  'http://fake'
  'http:fake'

1
এটি দিয়ে চেষ্টা করুন "https://portal.example.com/portal/#"। রুবি ২.১..6 এ মূল্যায়ন স্তব্ধ।
পুরাতন প্রো

আপনি ঠিক বলেছেন কিছু ক্ষেত্রে এই নিয়মিত
প্রকাশটি

1
স্পষ্টতই, এমন কোনও রেজেক্স নেই যা প্রতিটি দৃশ্যের অন্তর্ভুক্ত করে, তাই আমি কেবল একটি সাধারণ বৈধতা ব্যবহার করে শেষ করছি: বৈধতা: url, ফর্ম্যাট: {সহ: URI.regexp}, যদি: Proc.new {| a | a.url.present? }
হেরিবার্তো পেরেজ

5

আমি ইদানীং একই সমস্যায় পড়েছি (আমার কাছে একটি রেল অ্যাপ্লিকেশনগুলিতে ইউআরএলগুলি যাচাই করা দরকার ছিল) তবে ইউনিকোড ইউআরএলগুলির অতিরিক্ত প্রয়োজনীয়তা (যেমন http://кц.рф) সহ্য করতে হয়েছিল ...

আমি কয়েকটি সমাধান নিয়ে গবেষণা করেছি এবং নিম্নলিখিতগুলি দেখতে পেয়েছি:

  • প্রথম এবং সর্বাধিক প্রস্তাবিত জিনিসটি ব্যবহার করা হচ্ছে URI.parse । বিশদ জন্য সিমোন কারলেটির উত্তর চেক করুন। এটি ঠিক কাজ করে তবে ইউনিকোড url- এর জন্য নয় not
  • আমি যে দ্বিতীয় পদ্ধতিটি দেখেছি সেটি হ'ল ইলিয়া গ্রিগোরিক: http://www.igvita.com/2006/09/07/ediaating-url-in-ruby-on-rails/ মূলত, তিনি একটি অনুরোধ করার চেষ্টা করেন URL; যদি এটি কাজ করে তবে এটি বৈধ ...
  • তৃতীয় পদ্ধতিটি আমি খুঁজে পেয়েছি (এবং আমি পছন্দ করি এমনটি ) stdlib এর পরিবর্তে রত্ন URI.parseব্যবহার করার অনুরূপ একটি পদ্ধতি । এই পদ্ধতির বিস্তারিত এখানে দেওয়া হয়েছে: http://rawsyntax.com/blog/url-uthoration-in-rails-3-and-ruby-in-general/addressableURI

হ্যাঁ, Addressable::URI.parse('http:///').scheme # => "http"বা Addressable::URI.parse('Съешь [же] ещё этих мягких французских булок да выпей чаю')
ঠিকানার ঠিকানার

4

ডেভিড জেমস পোস্ট করা বৈধকারীর একটি আপডেট সংস্করণ এখানে । এটি বেঞ্জামিন ফ্লিশার প্রকাশ করেছেন । এদিকে, আমি একটি আপডেট হওয়া কাঁটাচামচ ঠেলেছি যা এখানে পাওয়া যাবে

require 'addressable/uri'

# Source: http://gist.github.com/bf4/5320847
# Accepts options[:message] and options[:allowed_protocols]
# spec/validators/uri_validator_spec.rb
class UriValidator < ActiveModel::EachValidator

  def validate_each(record, attribute, value)
    uri = parse_uri(value)
    if !uri
      record.errors[attribute] << generic_failure_message
    elsif !allowed_protocols.include?(uri.scheme)
      record.errors[attribute] << "must begin with #{allowed_protocols_humanized}"
    end
  end

private

  def generic_failure_message
    options[:message] || "is an invalid URL"
  end

  def allowed_protocols_humanized
    allowed_protocols.to_sentence(:two_words_connector => ' or ')
  end

  def allowed_protocols
    @allowed_protocols ||= [(options[:allowed_protocols] || ['http', 'https'])].flatten
  end

  def parse_uri(value)
    uri = Addressable::URI.parse(value)
    uri.scheme && uri.host && uri
  rescue URI::InvalidURIError, Addressable::URI::InvalidURIError, TypeError
  end

end

...

require 'spec_helper'

# Source: http://gist.github.com/bf4/5320847
# spec/validators/uri_validator_spec.rb
describe UriValidator do
  subject do
    Class.new do
      include ActiveModel::Validations
      attr_accessor :url
      validates :url, uri: true
    end.new
  end

  it "should be valid for a valid http url" do
    subject.url = 'http://www.google.com'
    subject.valid?
    subject.errors.full_messages.should == []
  end

  ['http://google', 'http://.com', 'http://ftp://ftp.google.com', 'http://ssh://google.com'].each do |invalid_url|
    it "#{invalid_url.inspect} is a invalid http url" do
      subject.url = invalid_url
      subject.valid?
      subject.errors.full_messages.should == []
    end
  end

  ['http:/www.google.com','<>hi'].each do |invalid_url|
    it "#{invalid_url.inspect} is an invalid url" do
      subject.url = invalid_url
      subject.valid?
      subject.errors.should have_key(:url)
      subject.errors[:url].should include("is an invalid URL")
    end
  end

  ['www.google.com','google.com'].each do |invalid_url|
    it "#{invalid_url.inspect} is an invalid url" do
      subject.url = invalid_url
      subject.valid?
      subject.errors.should have_key(:url)
      subject.errors[:url].should include("is an invalid URL")
    end
  end

  ['ftp://ftp.google.com','ssh://google.com'].each do |invalid_url|
    it "#{invalid_url.inspect} is an invalid url" do
      subject.url = invalid_url
      subject.valid?
      subject.errors.should have_key(:url)
      subject.errors[:url].should include("must begin with http or https")
    end
  end
end

দয়া করে লক্ষ্য করুন যে এখনও অদ্ভুত HTTP ইউআরআই রয়েছে যা বৈধ ঠিকানা হিসাবে পার্স করা হয়েছে।

http://google  
http://.com  
http://ftp://ftp.google.com  
http://ssh://google.com

এখানে একটি হল জন্য সমস্যার addressableমণি যা উদাহরণ জুড়ে।


3

আমি উপরের লাফার সলিউশনে সামান্য প্রকরণ ব্যবহার করি । এটি হোস্টনামে ক্রমাগত বিন্দুগুলিকে অনুমতি দেয় না (যেমন উদাহরণস্বরূপ www.many...dots.com):

%r"\A(https?://)?[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]{2,6}(/.*)?\Z"i

URI.parseস্কিমের উপসীকরণের আদেশ বলে মনে হচ্ছে, যা কিছু ক্ষেত্রে আপনি যা চান তা হ'ল না (যেমন আপনি যদি আপনার ব্যবহারকারীদেরকে ইউআরএলগুলি যেমন ফর্মগুলিতে দ্রুত বানান মঞ্জুর করতে চান twitter.com/username)


2

আমি 'অ্যাক্টিভুয়েডেটর' রত্ন ব্যবহার করেছি এবং এটি বেশ ভালভাবে কাজ করে (কেবলমাত্র ইউআরএলগুলির বৈধতার জন্য নয়)

আপনি এটি এখানে খুঁজে পেতে পারেন

এটি সমস্ত নথিভুক্ত তবে মূলত রত্নটি যুক্ত হওয়ার পরে আপনি একটি প্রাথমিককরণে নিম্নলিখিত কয়েকটি লাইন যুক্ত করতে চাইবেন: /config/enomotments/initializer/active_omotators_activation.rb

# Activate all the validators
ActiveValidators.activate(:all)

(দ্রষ্টব্য: আপনি প্রতিস্থাপন করতে পারেন: সমস্ত দ্বারা: ইউআরএল বা: আপনি কেবলমাত্র নির্দিষ্ট ধরণের মানকে বৈধতা দিতে চাইলে যাই হোক না কেন)

এবং তারপরে আবার আপনার মডেলটিতে ফিরে আসুন

class Url < ActiveRecord::Base
   validates :url, :presence => true, :url => true
end

এখন সার্ভারটি পুনরায় চালু করুন এবং এটি হওয়া উচিত


2

আপনি যদি সাধারণ বৈধতা এবং একটি কাস্টম ত্রুটি বার্তা চান:

  validates :some_field_expecting_url_value,
            format: {
              with: URI.regexp(%w[http https]),
              message: 'is not a valid URL'
            }

1

আপনি এমন কিছু ব্যবহার করে একাধিক ইউআরএলকে বৈধতা দিতে পারেন:

validates_format_of [:field1, :field2], with: URI.regexp(['http', 'https']), allow_nil: true

1
আপনি কীভাবে এই প্রকল্পটি ছাড়াই ইউআরএল পরিচালনা করবেন (যেমন www.bar.com/foo)?
ক্রেগ


1

সম্প্রতি আমার এই একই সমস্যা হয়েছিল এবং আমি বৈধ url- এর জন্য একটি কাজ খুঁজে পেয়েছি।

validates_format_of :url, :with => URI::regexp(%w(http https))
validate :validate_url
def validate_url

  unless self.url.blank?

    begin

      source = URI.parse(self.url)

      resp = Net::HTTP.get_response(source)

    rescue URI::InvalidURIError

      errors.add(:url,'is Invalid')

    rescue SocketError 

      errors.add(:url,'is Invalid')

    end



  end

বৈধতা_আরল পদ্ধতির প্রথম অংশটি ইউআরএল ফর্ম্যাটটি যাচাই করার জন্য যথেষ্ট। দ্বিতীয় অংশটি অনুরোধ প্রেরণ করে নিশ্চিত করবে যে ইউআরএল উপস্থিত রয়েছে।


ইউআরএল যদি খুব বড় একটি সংস্থার দিকে নির্দেশ করে (তবে বলুন, একাধিক গিগাবাইট)?
জন স্নাইডার

@ জনস্নাইডার একাউন্টের পরিবর্তে (যেমন এখানে ) একটি এইচটিসি হেড অনুরোধ ব্যবহার করতে পারে ।
ওয়েভেনজেন

1

আমি ইউআরআই মডিউলটি বৈধ যুক্ত করতে চান? পদ্ধতি

ভিতরে config/initializers/uri.rb

module URI
  def self.valid?(url)
    uri = URI.parse(url)
    uri.is_a?(URI::HTTP) && !uri.host.nil?
  rescue URI::InvalidURIError
    false
  end
end

0

এবং একটি মডিউল হিসাবে

module UrlValidator
  extend ActiveSupport::Concern
  included do
    validates :url, presence: true, uniqueness: true
    validate :url_format
  end

  def url_format
    begin
      errors.add(:url, "Invalid url") unless URI(self.url).is_a?(URI::HTTP)
    rescue URI::InvalidURIError
      errors.add(:url, "Invalid url")
    end
  end
end

এবং তারপরে include UrlValidatorআপনি যে কোনও মডেলের জন্য ইউআরএলটি যাচাই করতে চান in কেবল বিকল্পগুলির জন্য অন্তর্ভুক্ত।


0

ওয়েবসাইটের সংখ্যা ক্রমবর্ধমান এবং নতুন ডোমেন নামকরণের স্কিমগুলি সামনে আসতে থাকায় নিয়মিত এক্সপ্রেশন ব্যবহার করে ইউআরএল বৈধতা হ্যান্ডেল করা যায় না।

আমার ক্ষেত্রে, আমি কেবল একটি কাস্টম যাচাইকারী লিখি যা সফল প্রতিক্রিয়া পরীক্ষা করে।

class UrlValidator < ActiveModel::Validator
  def validate(record)
    begin
      url = URI.parse(record.path)
      response = Net::HTTP.get(url)
      true if response.is_a?(Net::HTTPSuccess)   
    rescue StandardError => error
      record.errors[:path] << 'Web address is invalid'
      false
    end  
  end
end

আমি pathআমার মডেলটির বৈশিষ্ট্যটি ব্যবহার করে যাচাই করছি record.path। আমি ব্যবহার করে ত্রুটিটিকে সংশ্লিষ্ট বৈশিষ্ট্যের নামেও চাপ দিচ্ছি record.errors[:path]

আপনি সহজেই এটি কোনও বৈশিষ্ট্যর নাম দিয়ে প্রতিস্থাপন করতে পারেন।

তারপরে, আমি কেবল আমার মডেলটিতে কাস্টম যাচাইকারকে কল করি।

class Url < ApplicationRecord

  # validations
  validates_presence_of :path
  validates_with UrlValidator

end

ইউআরএল যদি খুব বড় একটি সংস্থার দিকে নির্দেশ করে (তবে বলুন, একাধিক গিগাবাইট)?
জন স্নাইডার

0

আপনি এটির জন্য রেজেক্স ব্যবহার করতে পারেন, আমার জন্য এটি ভাল কাজ করে:

(^|[\s.:;?\-\]<\(])(ftp|https?:\/\/[-\w;\/?:@&=+$\|\_.!~*\|'()\[\]%#,]+[\w\/#](\(\))?)(?=$|[\s',\|\(\).:;?\-\[\]>\)])
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.