কম্পিউটার

কেন URI.join এত বিপরীত?

আমরা এইমাত্র হানিব্যাজারে একটি মাইলফলক পৌঁছেছি। আমাদের বিক্রয় পৃষ্ঠাগুলি আর আমাদের প্রধান রেল অ্যাপের অংশ নয়। এটি বছরের পর বছর ধরে আমার পছন্দের তালিকায় রয়েছে, কিন্তু ঠিক শীর্ষ অগ্রাধিকার নয়।

এই মাইগ্রেশনের অংশ হিসেবে, আমি নিজেকে URI.join ব্যবহার করে দেখেছি নির্দিষ্ট পুনঃনির্দেশিত লিঙ্ক নির্মাণ করতে. কিন্তু আমি দ্রুত একটি সমস্যায় পড়ে গেলাম। URI.join আমি যেমন আশা করেছিলাম তেমন আচরণ করছিলাম না।

আমি আশা করেছিলাম যে এটি একগুচ্ছ পথের টুকরো নিয়ে যাবে এবং সেগুলিকে এভাবে একত্রিত করবে:

# This is what I was expecting. It didn't happen.
URI.join("https://www.honeybadger.io", "plans", "change")
=> "https://www.honeybadger.io/plans/change"

কি join পদ্ধতিটি অনেক অপরিচিত। এটি আমার পথের একটি অংশকে ফেলে দিয়েছে, শুধুমাত্র শেষটি ব্যবহার করে, "পরিবর্তন।"

# This is what happened.
URI.join("https://www.honeybadger.io", "plans", "change")
=> "https://www.honeybadger.io/change"

তাহলে কেন এটা এভাবে কাজ করে?

ভুল বোঝাবুঝি

দেখা যাচ্ছে যে আমি URI.join আশা করছিলাম Array#join এর একটি বিশেষ সংস্করণের অনুরূপ আচরণ করতে , ইউআরএলের টুকরোগুলো নিয়ে সেগুলোকে একত্রিত করে একটি সম্পূর্ণ ইউআরএল তৈরি করে।

যে এটা কি না. বড় চমক।

আমরা যদি join দেখে নিই পদ্ধতির কোড, আমরা দেখি যে এটি সমস্ত আর্গুমেন্টের উপর পুনরাবৃত্তি করে এবং merge কল করে প্রতিটি.

# File uri/rfc2396_parser.rb, line 236
def join(*uris)
  uris[0] = convert_to_uri(uris[0])
  uris.inject :merge
end

মার্জ পদ্ধতি দুটি জিনিস করে:

  1. এটি আপনার স্ট্রিং যেমন "পৃষ্ঠাগুলি"কে একটি আপেক্ষিক URI অবজেক্টে রূপান্তর করে।
  2. এটি আপেক্ষিক URI-কে বেস URI-তে সমাধান করার চেষ্টা করে। এটি ঠিক যেভাবে RFC2396, সেকশন 5.2-তে উল্লেখ করা হয়েছে ঠিক সেভাবেই করে।

তাই এটা চমৎকার, কিন্তু আমি আগে উল্লেখ করা অপ্রত্যাশিত আচরণকে কীভাবে ব্যাখ্যা করে?

URI.join("https://www.honeybadger.io", "plans", "change")
=> "https://www.honeybadger.io/change"

এর মাধ্যমে পদক্ষেপ করা যাক. উপরের কোডটি এর সমতুল্য:

URI.parse("https://www.honeybadger.io/plans").merge("change")

উপরের কোডটি আপেক্ষিক URI সমাধান করার চেষ্টা করে, পরম URI "https://www.honeybadger.io/plans" এর বিপরীতে "পরিবর্তন করুন"।

এটি করার জন্য, এটি RFC2396, বিভাগ 5.2.6 অনুসরণ করে, যা বলে:

ক) বেস ইউআরআই এর পাথ কম্পোনেন্টের শেষ সেগমেন্ট বাফারে কপি করা হয়। অন্য কথায়, শেষ (ডান-সবচেয়ে) স্ল্যাশ অক্ষরের পরে যেকোনো অক্ষর, যদি থাকে, বাদ দেওয়া হয়।

b) রেফারেন্সের পাথ উপাদানটি বাফার স্ট্রিং এর সাথে যুক্ত করা হয়।

আসুন একসাথে খেলি:

  1. পরম URL এর চূড়ান্ত সেগমেন্ট ছাড়া সবকিছু কপি করুন। এটি আমাকে "https://www.honeybadger.io/" দেয়
  2. আপেক্ষিক পথ যোগ করুন, ফলে "https://www.honeybadger.io/change"

পৃথিবী আবার বোধগম্য হয়!

উপসংহার

যখন URI.join বিভিন্ন পাথ ফ্র্যাগমেন্ট থেকে ইউআরএল তৈরি করতে ব্যবহার করা যেতে পারে, এটি আসলে যা করার জন্য ডিজাইন করা হয়েছে তা নয়। এটিকে একটু বেশি জটিল কিছু করার জন্য ডিজাইন করা হয়েছে:RFC-তে নির্দিষ্ট মান অনুযায়ী ইউআরআইগুলিকে পুনরাবৃত্তিমূলকভাবে একত্রিত করুন।

আমার ব্যক্তিগত প্রকল্পের জন্য — আমাদের নতুন বিক্রয় পৃষ্ঠাগুলিতে পুনঃনির্দেশে ব্যবহার করার জন্য ইউআরএল তৈরি করা — ঠিক আছে, আমি পরিবর্তে অ্যারে# জয়েন ব্যবহার করেছি। :)

সম্পাদনা 8/12/2016: এই নিবন্ধটি প্রকাশ করার পরে আমি File.join ব্যবহার করার পরামর্শ দিয়ে কয়েকটি টুইট পেয়েছি এই উদ্দেশ্যে. এটি ডবল স্ল্যাশ এড়ানোর সুবিধা আছে, যেমন. /my//path কিন্তু উইন্ডোজের মতো ওএসে ভেঙে যাবে, যেখানে পাথ বিভাজক ফরওয়ার্ড-স্ল্যাশ নয়।


  1. Windows 10 বিনামূল্যে কেন?

  2. রেলে রুবি কি এবং কেন এটি দরকারী?

  3. কেন আমরা ক্লাস তৈরি করব?

  4. Windows 10 খারাপ কেন?