রিয়েল 3 এ লাইব ফোল্ডার থেকে মডিউল / শ্রেণি লোড করার সর্বোত্তম উপায়?


273

যেহেতু সর্বশেষতম রেল 3 রিলিজটি স্বয়ংক্রিয়ভাবে লোড করা মডিউল এবং ক্লাস থেকে ক্লাস নয়, সেগুলি লোড করার সর্বোত্তম উপায় কী হবে?

গিথুব থেকে:

A few changes were done in this commit:

Do not autoload code in *lib* for applications (now you need to explicitly 
require them). This makes an application behave closer to an engine 
(code in lib is still autoloaded for plugins);

উত্তর:


250

রেল ২.৩.৯ অনুসারে , একটি সেটিংস config/application.rbরয়েছে যাতে আপনি যে ডিরেক্টরিগুলি স্বনির্বাচিত করতে চান সেগুলি অন্তর্ভুক্ত করতে পারেন specify

প্রয়োগ.আরবি থেকে:

# Custom directories with classes and modules you want to be autoloadable.
# config.autoload_paths += %W(#{config.root}/extras)

7
আপনি যদি পুরো সাবট্রিটি অটোলোড করে দেখেন তবে @ কৃতজ্ঞদের জবাবও নোট করুন app/lib
টম হ্যারিসন

199
# Autoload lib/ folder including all subdirectories
config.autoload_paths += Dir["#{config.root}/lib/**/"]

উত্স: রেলস 3 কুইটিটিপ: অটোলোড লাইব ডিরেক্টরি সহ সমস্ত উপ-ডিরেক্টরিগুলি, অলস লোডিং এড়ান

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


লিঙ্কগুলি মারা গেছে
বেসি

84

অটলয়েডিং স্টাফের যাদু

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

সুতরাং যখন সাব-ডিরেক্টরিগুলি থেকে জিনিসগুলি লোড করার বিষয়টি আসে তখন একটি গ্যাচা বা কনভেনশন থাকে আপনার সচেতন হওয়া উচিত। কখনও কখনও রুবি / রেলস ম্যাজিক (এই সময়ে বেশিরভাগ রেল) কেন কিছু হচ্ছে তা বুঝতে অসুবিধা করতে পারে। অটোলোড পাথগুলিতে ঘোষিত যে কোনও মডিউল কেবল তখনই লোড হবে যখন মডিউলটির নাম প্যারেন্ট ডিরেক্টরি নামের সাথে মিল থাকে। সুতরাং আপনি যদি lib/my_stuff/bar.rbএমন কিছু দেওয়ার চেষ্টা করেন তবে :

module Foo
  class Bar
  end
end

এটি স্বয়ংক্রিয়ভাবে লোড হবে না। তারপর আবার আপনাকে পিতা বা মাতা Dir নামান্তর যদি fooএইভাবে পথ আপনার মডিউল হোস্টিং: lib/foo/bar.rb। এটি আপনার জন্য থাকবে। আরেকটি বিকল্প হ'ল আপনি যে ফাইলটি চান সেটি মডিউলের নাম দ্বারা নামকরণ করা। স্পষ্টতই তখন সেই নামে কেবল একটি ফাইল থাকতে পারে। আপনি যদি আপনার স্টাফটিকে অনেকগুলি ফাইলে বিভক্ত করতে চান তবে অবশ্যই অবশ্যই সেই ফাইলটি অন্য ফাইলগুলির প্রয়োজনের জন্য ব্যবহার করতে পারেন, তবে আমি সেটির প্রস্তাব দিই না, কারণ যখন তখন ডেভলপমেন্ট মোডে থাকে এবং আপনি সেই অন্যান্য ফাইলগুলিকে সংশোধন করেন তখন রেলগুলি স্বয়ংক্রিয়ভাবে অক্ষম থাকে এগুলি আপনার জন্য পুনরায় লোড করুন। আপনি যদি সত্যিই চান তবে আপনার কাছে মডিউল নামের একটি ফাইল থাকতে পারে যা মডিউলটি ব্যবহারের জন্য প্রয়োজনীয় প্রকৃত ফাইলগুলি নির্দিষ্ট করে। সুতরাং আপনার কাছে দুটি ফাইল থাকতে পারে: lib/my_stuff/bar.rbএবং lib/my_stuff/foo.rbপূর্ববর্তীটি উপরের মত একই এবং একক লাইনযুক্ত পরেরটি:require "bar"এবং এটি ঠিক একই কাজ করবে।

পিএস আমি আরও একটি গুরুত্বপূর্ণ জিনিস যুক্ত করতে বাধ্য বোধ করি। ইদানীং, যখনই আমি স্বাবলম্বন করা দরকার এমন লাইব ডিরেক্টরিতে কিছু পেতে চাই, আমি ভাবতে শুরু করি যে এটি যদি এমন কিছু হয় যা আমি আসলে এই প্রকল্পের জন্য বিশেষত বিকাশ করি (যা সাধারণত এটি হয় তবে এটি কোনও দিন হতে পারে) অনেক প্রকল্পে ব্যবহৃত কোডের একটি "স্ট্যাটিক" স্নিপেট বা গিট সাবমোডিয়াল ইত্যাদিতে পরিণত করুন .. যা ক্ষেত্রে অবশ্যই এটি লিবিব ফোল্ডারে থাকা উচিত) তবে সম্ভবত এটির জায়গাটি কোনও দিনই লিব ফোল্ডারে নেই। সম্ভবত এটি অ্যাপ ফোল্ডারের অধীনে সাবফোল্ডারে থাকা উচিত · আমার মনে হয় যে এটি কাজ করার নতুন রেলপথ। স্পষ্টতই, একই যাদুটি আপনার কাজগুলিতে যেখানেই অটোল্যাডের পথে কাজ করে থাকে আপনি নিজের জিনিসগুলি রাখেন তাই এই জিনিসগুলির পক্ষে এটি ভাল। যাইহোক, এটি কেবল বিষয়টিতে আমার চিন্তাভাবনা। আপনি দ্বিমত মুক্ত। :)


আপডেট: যাদু ধরনের সম্পর্কে ..

সেভেরিন তার মন্তব্যে যেমন উল্লেখ করেছেন, মূল "অটোল্যাড মডিউল মেকানিজম" নিশ্চিত যে এটি রুবির অংশ, তবে অটোলোড পথগুলি স্টাফ নয়। আপনার আরেলগুলি করার দরকার নেইautoload :Foo, File.join(Rails.root, "lib", "my_stuff", "bar")। এবং যখন আপনি প্রথমবার মডিউল ফুটিকে রেফারেন্স দেওয়ার চেষ্টা করবেন তখন এটি আপনার জন্য বোঝা হবে। তবে রেলগুলি যা করে তা হ'ল এটি আমাদের নিবন্ধিত ফোল্ডারগুলি থেকে স্বয়ংক্রিয়ভাবে স্টাফ লোড করার একটি উপায় দেয় এবং এটি এমনভাবে প্রয়োগ করা হয়েছে যাতে নামকরণের কনভেনশন সম্পর্কে কিছু ধারণা করা দরকার। যদি এটি এর মতো কার্যকর না করা হয়ে থাকে, তবে প্রতিবার আপনি যখন লোড করা হয়নি এমন কোনও কিছু উল্লেখ করেন তখন অটোল্যাড ফোল্ডারের সমস্ত ফাইলের মধ্যে দিয়ে যাচাই করতে হবে এবং এর মধ্যে যে কোনওটিতে আপনি উল্লেখ করার চেষ্টা করছেন কি না তা পরীক্ষা করে দেখতে হবে। এর ফলে অটোলোডিং এবং অটোরিলোডিংয়ের ধারণাটি পরাস্ত হবে। যাইহোক, এই কনভেনশনগুলির স্থানে এটি মডিউল / শ্রেণি থেকে আপনার লোড করার প্রয়াসটি কেটে নিতে পারে যেখানে এটি সংজ্ঞায়িত হতে পারে এবং কেবল এটি লোড করুন।


1
কেন এই রুবি যাদু? রুবি কেবলমাত্র মডিউল # অটোল্যাড ফাংশন সরবরাহ করে যা আপনি কোনও ( অপরিজ্ঞাত ) ধ্রুবক অ্যাক্সেস করার সময় লোড হওয়া কোনও ফাইলের কমান্ড করতে ব্যবহার করতে পারেন ( রুবি-ডোক.আর.অর্গ.ও.আর-1-1.3.3/Module.html#method-i-autoload দেখুন )। ডিরেক্টরি / ফাইলগুলির সাথে মডিউল / শ্রেণির নামের সাথে মিলে যাওয়া আমার মতে রেল / অ্যাক্টিভসপোর্টে করা হয়েছে (যেমন এখানে: github.com/rails/rails/blob/… )। আমি কি ভূল?
সেভরিন

হ্যাঁ, আমি বিশ্বাস করি আপনি সঠিক। জাবা যখন তার "ত্রুটি" দেখিয়েছিলেন তখন আমি আমার আসল উত্তরটি "সংশোধন" করতে খুব তাড়াহুড়ো করেছিলাম। এই সমস্যাটি পরিষ্কার করতে আমার উত্তরটি আরও কিছুটা আপডেট করুন update
টিমো

1
আমি প্রায় অর্ধ ঘন্টা বা প্রায় চট করে কাটিয়েছি। স্প্রোকেটস :: জেএসরেন্ডার :: প্রসেসরের অটোলোড করার জন্য আমার প্রয়োজন ছিল (চেয়েছিল)। এর জন্য পথটি রেল কনসোলে প্রবেশ করে এবং "স্প্রোকেটস :: জেএসরেন্ডার :: প্রসেসর" করে খুঁজে পাওয়া যাবে unders
পেডজ

আপনি কেবল আমার বিচক্ষণতা বাঁচিয়েছেন। relief গভীর দীর্ঘশ্বাস sharing ভাগ করে নেওয়ার জন্য আপনাকে অনেক ধন্যবাদ :)
ব্রেন্ডেন

এই সবচেয়ে সহায়ক মন্তব্যের জন্য আপনাকে ধন্যবাদ। আমি বুঝতে পারি না যে আপনার মন্তব্যটি না পড়া পর্যন্ত কিছু মডিউল কেন তাদের মতো আচরণ করছে। তোমার উপর দোয়া!
mjnissim

41

সতর্কতা: আপনি যদি 'লাইব' ফোল্ডার থেকে 'বানর প্যাচ' বা 'ওপেন ক্লাস' লোড করতে চান, তবে 'অটোল্যাড' পদ্ধতির ব্যবহার করবেন না !!!

  • " config.autoload_paths " পদ্ধতির: কেবলমাত্র যদি আপনি কোনও এক জায়গায় সংজ্ঞায়িত এমন শ্রেণিটি লোড করে থাকেন তবেই কাজ করে। যদি কিছু শ্রেণি ইতিমধ্যে অন্য কোথাও সংজ্ঞায়িত করা থাকে, তবে আপনি এই পদ্ধতির মাধ্যমে এটিকে আর লোড করতে পারবেন না।

  • " কনফিগার / ইনিশিয়ালাইজার / লোড_আরবি_ফিল.আরবি " পদ্ধতির: সর্বদা কাজ করে! টার্গেট ক্লাস যে কোনও নতুন ক্লাস বা বিদ্যমান ক্লাসের জন্য "ওপেন ক্লাস" বা "বানর প্যাচ" যাই হোক না কেন এটি সর্বদা কার্যকর হয়!

আরও বিশদের জন্য দেখুন: https://stackoverflow.com/a/6797707/445908


6
এটি বোঝার জন্য একটি গুরুত্বপূর্ণ পার্থক্য। এর জন্য ধন্যবাদ.
টাইলার কলিয়ার


18

আমার ক্ষেত্রে আমি সরাসরি একটি লিবিব ডায়ারের অধীনে একটি ফাইল লোড করার চেষ্টা করছিলাম।

Application.rb এর মধ্যে ...

require '/lib/this_file.rb' 

কাজ করছিল না, এমনকি কনসোলেও ছিলাম এবং তারপরে যখন আমি চেষ্টা করেছিলাম

require './lib/this_file.rb' 

এবং রেলগুলি পুরোপুরিভাবে ফাইলটি লোড করে।

আমি এখনও বেশ নুব এবং আমি নিশ্চিত না কেন এটি কাজ করে তবে এটি কাজ করে। যদি কেউ আমার কাছে এটি ব্যাখ্যা করতে চান তবে আমি এটির প্রশংসা করব: ডিআই আশা করি এটি যে কোনও উপায়ে সহায়তা করবে।


2
এটি কারণ।। উদাহরণ: ./lib/this_file.rb = /var/www/myrailsapp/lib/this_file.rb, /lib/this_file.rb = /lib/this_file.rb
জেসন

7

আমারও একই সমস্যা ছিল। এখানে আমি এটি সমাধান করেছি। সমাধানটি lib ডিরেক্টরি এবং সমস্ত উপ-ডিরেক্টরিগুলি (কেবলমাত্র সরাসরি নয়) লোড করে। অবশ্যই আপনি এটি সমস্ত ডিরেক্টরিতে ব্যবহার করতে পারেন।

# application.rb
config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]

5
এটি সম্পূর্ণ ক্লোবারবারিং রেলস নেমস্পেসিং কনভেনশনগুলির বাজে পার্শ্ব প্রতিক্রিয়া রয়েছে। যদি lib / bar / foo.rb বারকে সংজ্ঞায়িত করে :: অটোলোড অনুসন্ধানে lib / foo.rb Foo সংজ্ঞায়নের আগে ফু উপস্থিত হয়, তবে আপনি Expected lib/bar/foo.rb to define constant Fooযদি Foo উল্লেখ করে lib / foo.rb লোড করার চেষ্টা করেন তবে বিভ্রান্তিকর ত্রুটি পাবেন ধ্রুব।
জ্যাকব

5

config.autoload_paths আমার পক্ষে কাজ করে না। আমি এটি অন্যভাবে সমাধান করি

3 রেল অন রুবি / লিবিব ফোল্ডার থেকে স্বয়ংক্রিয় পুনরায় লোড (অটোলোড) কোড নয়। আমি ভিতরে রেখে সমাধান করিApplicationController

Dir["lib/**/*.rb"].each do |path|
  require_dependency path
end 

4

যদি কেবলমাত্র কয়েকটি ফাইলকেই লিবির মডিউলগুলিতে অ্যাক্সেসের প্রয়োজন হয় তবে কেবল প্রয়োজনীয় ফাইলগুলিতে একটি প্রয়োজনীয় বিবৃতি যুক্ত করুন। উদাহরণস্বরূপ, যদি কোনও মডেলটির একটি মডিউল অ্যাক্সেস করার প্রয়োজন হয় তবে যুক্ত করুন:

require 'mymodule'

Model.rb ফাইলের শীর্ষে।


50
আপনার requireকোনও রেল অ্যাপ্লিকেশন ব্যবহার করা উচিত নয় , কারণ এটি ActiveSupport::Dependenciesসঠিকভাবে কোডটি লোড করা থেকে [আন] রোধ করে । পরিবর্তে আপনার config.autoload_pathsউপরের উত্তরের মতো ব্যবহার করা উচিত এবং তারপরে প্রয়োজনীয় হিসাবে অন্তর্ভুক্ত / প্রসারিত করুন।
ben_h

13
আপনাকে ধন্যবাদ মাইক, আপনি যা করেছেন আমি তা করতে যাচ্ছিলাম, কেন এটি খারাপ, তার ব্যাখ্যাটি দেখে ভাল লাগলো, উত্তরটি সরিয়ে না দেওয়ার জন্য ধন্যবাদ।
pupeno

আপনি যদি কেবল একটি মডিউল লোড করতে চান তবে 'মাইমডিউল' অন্তর্ভুক্ত কী?
মাইক

1
@ বেএন_এইচ আপনার কি requireকোনও রেল অ্যাপের কোথাও থেকে আসা উচিত নয় ? রেক টাস্কে আমি বর্তমানে বাস করছি এমন একটি মডিউল- requireও করছি । আমি কি এটা করা উচিত নয়? includelib/
ডেনিস

@ বেন_এইচ আমার অনুসন্ধানটি প্রকাশ করে যে এটি requireআপনার lib/কোডের মধ্যে সাধারণ (উদাঃ এই ব্লগ পোস্ট , এই উত্তরের উত্তর )। আমি এখনও পুরো বিষয়টি সম্পর্কে অনিশ্চিত। আপনি না ব্যবহারের দাবির পিছনে আরও প্রমাণ দিতে পারেন require?
ডেনিস

2

ফাইলের নামটি সঠিকভাবে বানান।

সিরিয়াসলি। আমি এক ঘন্টা ক্লাসের সাথে লড়াই করেছি কারণ ক্লাসটি ছিল গভর্নেন্স :: আর্কিটেকচারবোর্ড এবং ফাইলটি ছিল lib / গভর্নমেন্ট / আর্কিটেকচার_বার্ড.আরবিতে ("বোর্ড" তে ও এবং এ স্থানান্তরিত)

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


2

এর হিসাবে Rails 5, এটা ফোল্ডারে জন্য অ্যাপ্লিকেশন ডিরেক্টরি অধীনে liberal এর সংক্ষিপ্ত রূপ ফোল্ডারের করা বা এর পরিবর্তে তৈরি অন্যান্য অর্থপূর্ণ নাম স্পেস বাঞ্ছনীয় services, presenters,features ইত্যাদি এবং পাগল এর দ্বারা স্বয়ংক্রিয়ভাবে লোড জন্য অ্যাপ্লিকেশন ডিরেক্টরি অধীনে লাগাতে হবে।

দয়া করে এই গিটহাব আলোচনার লিঙ্কটিও পরীক্ষা করুন


1

লাইব থেকে লোড করতে আপনার সমস্যা হতে পারে এমন বেশ কয়েকটি কারণ রয়েছে - বিশদ বিবরণের জন্য এখানে দেখুন - http://www.williambharding.com/blog/technology/rails-3-autoload-modules-and-class-in-prod/

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