রুবি বা রেলগুলির সাথে কোনও ইউআরএল থেকে ইউআরএল প্যারামিটার কীভাবে আহরণ করবেন?


137

আমার মতো কিছু ইউআরএল রয়েছে

http://www.example.com/something?param1=value1&param2=value2&param3=value3

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

আসলে, আমার এমন একটি পদ্ধতি দরকার যা এটি করবে:

extract_parameters_from_url("http://www.example.com/something?param1=value1&param2=value2&param3=value3")
#=> {:param1 => 'value1', :param2 => 'value2', :param3 => 'value3'}

আপনার কিছু পরামর্শ আছে?


1
Hash[*string.split('&').collect{|i|i.split('=')}.flatten] এটি খুব কার্যকর হবে তবে এটি সম্ভবত এই ক্ষেত্রে সবচেয়ে খারাপ বিকল্প। তবে তবুও আপনি এই স্নিপেট আকর্ষণীয় মনে হতে পারে। (আমি এটিকে উত্তর হিসাবে বিবেচনা করি না বলে মন্তব্য হিসাবে পোস্ট করা :-))
ভোজ্টো

উত্তর:


162

আমি মনে করি আপনি প্রদত্ত যে কোনও ইউআরএল স্ট্রিংকে হ্যাশে পরিণত করতে চান?

আপনি http://www.ruby-doc.org/stdlib/libdoc/cgi/rdoc/classes/CGI.html#M000075 চেষ্টা করতে পারেন

require 'cgi'

CGI::parse('param1=value1&param2=value2&param3=value3')

আয়

{"param1"=>["value1"], "param2"=>["value2"], "param3"=>["value3"]}

1
ঠিক আছে, সেটাই আমি মিস করেছি! এটি ইউআরআই.পার্সের সাথে ব্যবহারের সময় নিখুঁত: সিজিআই.পারস (ইউআরআই.পার্স (" উদাহরণ. com/… ) কাঙ্ক্ষিত হ্যাশ ফিরিয়ে দেয়
your

91
স্পষ্টতার জন্য, @ ফ্ল্যাকউ এটি চান: CGI.parse(URI.parse(url).query)
গ্লেন জ্যাকম্যান

আমি এটি পরীক্ষা করিনি, তবে সম্পূর্ণ url সমেত তালিকাভুক্ত প্রথম কীটি সত্যই ভুল বলে মনে হচ্ছে।
লেবি

2
আমাকে আসলে এটি ব্যবহার করতে হয়েছিল: CGI::parse(URI::parse(url).query)
পোর্টফোরওয়ার্ডপোডকাস্ট

151

আমি নিজেকে সাম্প্রতিক প্রকল্পের জন্য একই জিনিসটির প্রয়োজন বলে মনে করেছি। লেবির সমাধানের ভিত্তিতে বিল্ডিং, এখানে একটি ক্লিনার এবং দ্রুত পদ্ধতি রয়েছে:

Rack::Utils.parse_nested_query 'param1=value1&param2=value2&param3=value3'
# => {"param1"=>"value1", "param2"=>"value2", "param3"=>"value3"}

একটি র্যাক অনুরোধ উপহাস করার চেয়ে অনেক বেশি হালকা
গ্যারেথ

2
ভাল সন্ধান। আপনার যদি সাধারণ প্যারাম থাকে (নির্দোষহীন) এবং পারফরম্যান্স সংবেদনশীল হন, তবে র্যাক :: ইউটিলেস.পারস_কোয়ারি আগ্রহী হতে পারে। কোডটি পড়ার মতো: github.com/rack/rack/blob/master/lib/rack/utils.rb
লেবি

আপনাকে ধন্যবাদ, এটি খুব দরকারী :)
ব্লু স্মিথ

এই ভাল কাজ করে কিন্তু একই নামের চেকবাক্সগুলি জন্য কাজ করে না: param1=value1&param1=value2। দ্বিতীয় মানটি প্রথমে ট্রাম্প করে।
বি সাত

বিপরীত সন্ধানকারী যে কোনও ব্যক্তির জন্য, এটি Rack::Utils.build_nested_query(params)(বা Rack::Utils.build_query(params)যদি পার্স করা থাকে Rack::Utils.parse_query)।
জেলানিক্স

99

উপরে লেবির উত্তর দিয়ে কেবল উন্নত -

Rack::Utils.parse_query URI("http://example.com?par=hello&par2=bye").query

উপরের ইউআরএলের মতো স্ট্রিংয়ের জন্য, এটি ফিরে আসবে

{ "par" => "hello", "par2" => "bye" } 

7
দুর্দান্ত উত্তর সহজ, অপের মত জিজ্ঞাসার মতো পুরো URL টি প্রসেস করে এবং ফলাফলের মানগুলি অন্য উত্তরের মতো অ্যারেগুলির পরিবর্তে স্ট্রিং হয়। ধন্যবাদ।
jackocnr

3
আমি উপরে মন্তব্য হিসাবে, যে কেউ বিপরীত খুঁজছেন জন্য, এটি Rack::Utils.build_query(params)
জেলানিক্স

1
সতর্কতা অবলম্বন করুন - যথেষ্ট বিপরীত নয়, কমপক্ষে রুবি ১.৮..7 / রেলগুলি ২.৩ এ নেই। Foo এর ক্যোয়ারী স্ট্রিং [] = 1 & foo [] = 2 কে সঠিকভাবে {"foo" => ["1", "2"]} হিসাবে পার্স করা হয়েছে, তবে বিল্ড-কোয়েরিটি "foo = 1 & foo = 2" এ পরিবর্তিত হয়, যা পার্স করার সময় আবার {"foo" => "2"} পাওয়া যায়}
রেলস

44

একটি বিশুদ্ধ রুবি সমাধান জন্য একত্রিত URI.parseসঙ্গে CGI.parse(এই এমনকি পাগল / তাক ইত্যাদি প্রয়োজন হয় না যদি ব্যবহার করা যেতে পারে):

CGI.parse(URI.parse(url).query) 
# =>  {"name1" => ["value1"], "name2" => ["value1", "value2", ...] }

33

আপনার সমস্যা সমাধানের জন্য একাধিক উপায় রয়েছে। অন্যরা আপনাকে কিছু কৌশল দেখিয়েছে। আমি অন্য কৌশল জানি। আমার চেষ্টা এখানে:

require 'uri'
url = "http://www.example.com/something?param1=value1&param2=value2&param3=value3"
uri = URI(url)
# => #<URI::HTTP:0x89e4898 URL:http://www.example.com/something?param1=value1&param2=value2&param3=value3>
URI::decode_www_form(uri.query).to_h # if you are in 2.1 or later version of Ruby
# => {"param1"=>"value1", "param2"=>"value2", "param3"=>"value3"}
Hash[URI::decode_www_form(uri.query)] # if you are below 2.1 version of Ruby
# => {"param1"=>"value1", "param2"=>"value2", "param3"=>"value3"}

এর পদ্ধতি ডকুমেন্টেশন পড়ুন ::decode_www_form


13

পরীক্ষা করে দেখুন Addressable মণি - QUERY সহজ পার্স করে তোলে রুবি এর কোনো URI মডিউলের জন্য একটি জনপ্রিয় প্রতিস্থাপন:

require "addressable/uri"
uri = Addressable::URI.parse("http://www.example.com/something?param1=value1&param2=value2&param3=value3")
uri.query_values['param1']
=> 'value1'

(এটি ইউআরআই থেকে পৃথকভাবে প্যারাম এনকোডিং / ডিকোডিংও পরিচালনা করে)


-3

আপনার কন্ট্রোলারে, আপনার ডাকা একটি অভিধান (হ্যাশ) অ্যাক্সেস করতে সক্ষম হওয়া উচিত params। সুতরাং, যদি আপনি জানেন যে প্রতিটি ক্যোয়ারী প্যারামিটারের নাম কী, তবে ঠিক করুনparams[:param1] এটি অ্যাক্সেস করার জন্য করুন ... প্যারামিটারগুলির নাম কী তা যদি আপনি না জানেন তবে আপনি অভিধানটি পেরিয়ে কীগুলি পেতে পারেন।

কিছু সহজ উদাহরণ এখানে


ঠিক আছে, আমি জানতাম যে এটি অনুরোধ করা ইউআরএল সঙ্গে নিয়ামকটিতে ভাল কাজ করে, তবে অন্যদের জন্য কীভাবে এটি করা যায় যথেচ্ছ ইউআরএল?
ফ্ল্যাকউ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.