আমি জানি যে এই প্রশ্নটি প্রথম জিজ্ঞাসা করার পরে অনেক দিন হয়েছে, তবে আমার একটি অতিরিক্ত উত্তর রয়েছে যা আমি ভাগ করতে চাই।
আমার বেশ কয়েকটি রুবি অ্যাপ্লিকেশন রয়েছে যা বেশ কয়েক বছর ধরে অন্য প্রোগ্রামার দ্বারা বিকাশ করা হয়েছিল এবং তারা একই অ্যাপ্লিকেশনগুলিতে বিভিন্ন অ্যাপ্লিকেশনটিতে পুনরায় ব্যবহার করে যদিও তারা একই ডেটাবেস অ্যাক্সেস করতে পারে। যেহেতু এটি ডিআরওয়াই বিধি লঙ্ঘন করেছে, তাই আমি রুবি অ্যাপ্লিকেশনগুলির দ্বারা ভাগ করে নেওয়ার জন্য একটি ক্লাস লাইব্রেরি তৈরি করার সিদ্ধান্ত নিয়েছি। আমি এটি মূল রুবি লাইব্রেরিতে রাখতে পারতাম, তবে এটি সাধারণ কোডবেসে কাস্টম কোডটি লুকিয়ে রাখত যা আমি করতে চাই না।
ইতিমধ্যে সংজ্ঞায়িত নাম "প্রোফাইল.rb" এবং আমি যে ক্লাসটি ব্যবহার করছিলাম তার মধ্যে আমার একটি নাম বিরোধ ছিল I আমি সাধারণ কোড লাইব্রেরি তৈরির চেষ্টা না করা পর্যন্ত এই বিরোধ কোনও সমস্যা ছিল না। সাধারণত, রুবি প্রথমে অ্যাপ্লিকেশনগুলির অবস্থান অনুসন্ধান করে, তারপরে $ LOAD_PATH অবস্থানগুলিতে যায়।
অ্যাপ্লিকেশন_কন্ট্রোলআরআরবি আমার তৈরি করা ক্লাসটি খুঁজে পেল না এবং মূল সংজ্ঞাটিতে একটি ত্রুটি ছুঁড়েছে কারণ এটি কোনও শ্রেণি নয়। যেহেতু আমি অ্যাপ্লিকেশনটির অ্যাপ্লিকেশন / মডেল বিভাগ থেকে শ্রেণি সংজ্ঞাটি সরিয়েছি, রুবি সেখানে এটি খুঁজে পেল না এবং রুবি পথগুলিতে এটি সন্ধান করতে গিয়েছিল।
সুতরাং, আমি যে লাইব্রেরি ডিরেক্টরিটি ব্যবহার করছিলাম সেগুলির পাথ অন্তর্ভুক্ত করার জন্য আমি $ LOAD_PATH ভেরিয়েবলটি সংশোধন করেছি। এটি পরিবেশগত.আরবি ফাইলে শুরু করার সময় করা যেতে পারে।
এমনকি অনুসন্ধানের পথে নতুন ডিরেক্টরি যুক্ত হওয়ার পরেও রুবি একটি ত্রুটি ফেলছিল কারণ এটি প্রথমে সিস্টেম-সংজ্ঞায়িত ফাইলটিকে প্রথমে গ্রহণ করছিল। Path LOAD_PATH ভেরিয়েবলের সন্ধানের পথটি প্রথমে রুবি পাথ অনুসন্ধান করে।
সুতরাং, আমাকে অনুসন্ধানের অর্ডারটি পরিবর্তন করতে হবে যাতে অন্তর্নির্মিত লাইব্রেরিগুলি অনুসন্ধান করার আগে রুবি আমার সাধারণ লাইব্রেরিতে ক্লাসটি খুঁজে পেয়েছিল।
এই কোডটি পরিবেশ.আরবি ফাইলে এটি করেছে:
Rails::Initializer.run do |config|
* * * * *
path = []
path.concat($LOAD_PATH)
$LOAD_PATH.clear
$LOAD_PATH << 'C:\web\common\lib'
$LOAD_PATH << 'C:\web\common'
$LOAD_PATH.concat(path)
* * * * *
end
আমি মনে করি না আপনি এই স্তরের আগে প্রদত্ত উন্নত কোডিং কনস্ট্রাক্টসগুলির কোনওটি ব্যবহার করতে পারেন তবে আপনি যদি আপনার অ্যাপ্লিকেশনটিতে প্রারম্ভিক সময়ে কিছু সেটআপ করতে চান তবে এটি ঠিক কাজ করে। আপনাকে নতুন vari LOAD_PATH ভেরিয়েবলের মূল ক্রমটি বজায় রাখতে হবে যখন এটি আবার নতুন ভেরিয়েবলটিতে যুক্ত হবে অন্যথায় প্রধান রুবি শ্রেণীর কিছু হারিয়ে যায়।
Application_controller.rb ফাইলটিতে আমি কেবল একটি ব্যবহার করি
require 'profile'
require 'etc'
এবং এটি পুরো অ্যাপ্লিকেশনটির জন্য কাস্টম লাইব্রেরি ফাইলগুলি লোড করে, অর্থাত্, প্রতিটি কন্ট্রোলারে আমাকে কমান্ডের প্রয়োজন হয় না।
আমার জন্য, এটিই আমি সমাধানটি সন্ধান করছি এবং আমি ভেবেছিলাম তথ্যটি পাশ করার জন্য আমি এই উত্তরটিতে যুক্ত করব।
File.expand_path(File.dirname(__FILE__)).tap {|pwd| $LOAD_PATH.unshift(pwd) unless $LOAD_PATH.include?(pwd)}