ruby on rails - স্বয়ংক্রিয়ভাবে লোড মধ্যে ফাইল ফাইল 4 লোড




ruby-on-rails ruby-on-rails-4 (3)

আমি এই আপনার সমস্যা সমাধান করতে পারে মনে হয়:

  1. কনফিগারেশন / application.rb মধ্যে :

    config.autoload_paths << Rails.root.join('lib')

    এবং lib মধ্যে সঠিক নামকরণ কনভেনশন রাখা।

    lib / foo.rb এ :

    class Foo
    end

    lib / foo / bar.rb এ :

    class Foo::Bar
    end
  2. যদি আপনি সত্যিই lib / extensions.rb ফাইলের মধ্যে কিছু বানর প্যাচ করতে চান তবে আপনি নিজে এটির প্রয়োজন হতে পারে:

    কনফিগার / initializers / require.rb এ :

    require "#{Rails.root}/lib/extensions" 

দ্রষ্টব্য

আমি বিকাশের সময় আমার /lib ডিরেক্টরিতে কোডটি স্বয়ংক্রিয়ভাবে লোড করার জন্য একটি প্রারম্ভিক রূপে নিম্নলিখিত লাইনটি ব্যবহার করি:

কনফিগ / initializers / custom.rb:

RELOAD_LIBS = Dir[Rails.root + 'lib/**/*.rb'] if Rails.env.development?

( Rails 3 কুইকটিপ থেকে: উন্নয়ন মোডে অটো পুনরায় লোড lib ফোল্ডার )

এটি দুর্দান্ত কাজ করে, কিন্তু এটি উৎপাদন ক্ষেত্রে ব্যবহারযোগ্য নয়- প্রতিটি অনুরোধে lib লোড করার পরিবর্তে, আমি কেবল শুরুতে তাদের লোড করতে চাই। একই ব্লগটিতে কীভাবে এটি করা যায় তার আরেকটি নিবন্ধ রয়েছে:

কনফিগ / application.rb:

# Custom directories with classes and modules you want to be autoloadable.
config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]

যাইহোক, যখন আমি যেটিকে স্যুইচ করি, তখনও ডেভেলপমেন্টে, যখন আমি lib ফাংশনগুলি ব্যবহার করার চেষ্টা করি তখন NoMethodErrors পাই।

আমার lib ফাইলগুলির মধ্যে একটি উদাহরণ:

lib / অনুপস্থিত extensions.rb:

Time.class_eval do
  def self.milli_stamp
    Time.now.strftime('%Y%m%d%H%M%S%L').to_i
  end
end

Time.milli_stamp কলিং Time.milli_stamp নিক্ষেপ করা হবে

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


এটি আমার মত এমন কাউকে সাহায্য করতে পারে যা Rails ক্লাস লোডিং পরিচালনা করে সমাধানগুলির জন্য অনুসন্ধানের সময় এই উত্তরটি খুঁজে পেতে পারে ... আমি দেখেছি যে আমাকে এমন একটি module সংজ্ঞায়িত করতে হয়েছিল যার নামটি কেবলমাত্র একটি শ্রেণি নির্ধারণ করার পরিবর্তে আমার ফাইল নামটি মিলেছে:

ফাইল lib / development_mail_interceptor.rb (হ্যাঁ, আমি একটি Railscast থেকে কোড ব্যবহার করছি :))

module DevelopmentMailInterceptor
  class DevelopmentMailInterceptor
    def self.delivering_email(message)
      message.subject = "intercepted for: #{message.to} #{message.subject}"
      message.to = "[email protected]"
    end
  end
end

কাজ করে, কিন্তু যদি আমি কোনও মডিউলের ভিতরে ক্লাস না রাখি তবে এটি লোড হয় না।


যদিও এটি সরাসরি প্রশ্নের উত্তর দেয় না, তবে আমি মনে করি সম্পূর্ণ প্রশ্নটি এড়াতে এটি একটি ভাল বিকল্প।

সমস্ত autoload_paths বা eager_load_paths ঝগড়া এড়ানোর জন্য, "app" ডিরেক্টরির অধীনে একটি "lib" বা "misc" ডিরেক্টরি তৈরি করুন। কোডগুলি সাধারণত আপনি সেখানেই করবেন, এবং Rails লোড হবে (এবং পুনরায় লোড) মডেল ফাইলগুলির মতো ফাইলগুলি লোড করবে।





ruby-on-rails-4