4 রেলগুলিতে স্বতঃ-লোডিং lib ফাইলগুলি


229

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

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

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

( ails টি কুইলটিপ থেকে: বিকাশ মোডে লিব ফোল্ডারগুলি স্বয়ংক্রিয়ভাবে পুনরায় লোড করুন )

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

কনফিগ / 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 ফাংশনগুলি ব্যবহার করার চেষ্টা করার সময় আমি NoMethodErferences পাই।

আমার লিব ফাইলগুলির একটি উদাহরণ:

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_stampNoMethodError নিক্ষেপ করবে

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


যখন কোনও রেলস অ্যাপ শুরু হবে তখন কনফিগারেশন / আরম্ভকারী ফোল্ডারটি স্বয়ংক্রিয়ভাবে লোড হবে?
Jwan622

উত্তর:


548

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

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

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

    এবং নামকরণের সঠিক কনভেনশনটিকে সমান রাখুন

    মধ্যে lib / অনুপস্থিত foo.rb :

    class Foo
    end

    মধ্যে lib / অনুপস্থিত foo বিন্যাস / bar.rb :

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

    মধ্যে কনফিগ / initializers / require.rb :

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

পুনশ্চ


1
@ ifyouseewendy- আপনি ঠিক ঠিক বলেছেন - কারণ এক্সটেনশনস.আরবি রেল নামকরণের সম্মেলনগুলি অনুসরণ করে না, রেলগুলি এটিকে লোডিং প্রক্রিয়াতে অন্তর্ভুক্ত করবে না। আমি ম্যানুয়ালি এটির প্রয়োজনে এটি কাজ করেছিলাম।
ইয়ারিন

@ifouseewendy মডেলগুলি লোড হওয়ার আগে আমি কীভাবে ফাইলগুলি অন্তর্ভুক্ত করতে পারি? অটোলোডের পথটি যুক্ত করুন এটি দুর্দান্ত, তবে অন্তর্ভুক্তির ক্রমটি কীভাবে নিয়ন্ত্রণ করবেন? thx
ম্যাট্রিক্স

@ ম্যাট্রিক্স "মডেলগুলি লোড হওয়ার আগে ফাইলগুলি অন্তর্ভুক্ত করে", অটোল্যাড বৈশিষ্ট্যটি ব্যবহার না করে আপনাকে ম্যানুয়ালি আপনার ফাইলের প্রয়োজন হতে পারে।
ifyouseewendy

@ifieeewendy আমার যদি এটি প্রারম্ভকালে প্রয়োজন হয় তবে ফাইলটি অটোলোড_পথের মধ্যে রয়েছে, এটি পুনরায় লোড হবে (2 বার লোড হবে) না? পিএইচপি এর মতো একটি "প্রয়োজনীয়_অনসেস" কি?
ম্যাট্রিক্স

5
এটি প্রযোজনায় রেল 5 এপিআই তে কাজ করে না বলে মনে হয় (তবে বিকাশে রয়েছে)। আমি বিশ্বাস করি যে আপনার ব্যবহার করা দরকার config.eager_load_paths << Rails.root.join('lib')। যাইহোক, এটির একটি কার্যকারিতা রয়েছে যা eager_load_pathsকাজগুলিতে সমস্ত কিছু লোড করে। আমার মনে হয় লুলালালার সমাধান আরও ভাল। আরও বিশদ সহ এখানে একটি ব্লগ পোস্ট রয়েছে: blog.arkency.com/2014/11/…
হিরোওয়াতারী

33

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

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


3
আমি কারাগারে 4.2। এবং এটি ফাইলগুলি স্বয়ংক্রিয়ভাবে লোড করে না app, আমার এটি নিজেই করা দরকার ...... বা এটি স্বয়ংক্রিয় পথে রাখার দরকার আছে ..
অরূপ রক্ষিত

6
তুমি ভুল, অরূপ, অ্যাপ্লিকেশন ডিরেক্টরি কোন সাবডিরেক্টরি স্বয়ংক্রিয়ভাবে পাগল 4.2.See মধ্যে autoload_paths অ্যারের মধ্যে হয় edgeguides.rubyonrails.org/...
Dr.Strangelove

app/viewsযোগ করা হয় না ডিরেক্টরি বাদে ; বা বরং স্পষ্টভাবে মুছে ফেলা হয়।
জেমস বি। বাইর্ন

1
দুর্দান্ত উত্তর। রেল 5 / এপিআইয়ের জন্য কেবল আমার জন্য কাজ করেছে।
jstafford

6
কেবল মনে রাখবেন যে libকোডটির জন্য যা একাধিক প্রকল্পে প্রয়োগ করা যেতে পারে এবং সম্ভবত একটি রত্নটিতে নিষ্কাশন করা যেতে পারে। যদি তা না হয় যেমন অ্যাপ অনুসন্ধান অধীনে একটি আরো উপযুক্ত ফোল্ডার তৈরি services/বা presenters/এবং এমনকি এই বন্ধ subdirs।
ফিলিটি

6

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

ফাইল লাইব / ডেভলপমেন্ট_মেল_ইন্টারসেপ্টার.আরবিতে (হ্যাঁ, আমি একটি রেলকাস্ট থেকে কোড ব্যবহার করছি :))

module DevelopmentMailInterceptor
  class DevelopmentMailInterceptor
    def self.delivering_email(message)
      message.subject = "intercepted for: #{message.to} #{message.subject}"
      message.to = "myemail@mydomain.org"
    end
  end
end

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


1
রুবিতে "যথাযথভাবে ম্যাচিং" এর অর্থ ফাইলটি রুব অ্যাপ্লিকেশন দ্বারা ব্যবহৃত লোড পাথগুলিতে LOAD_PATH/module/class.rb(আন্ডারকর্ডেড) ফাইল ফাইলটিতে অবস্থিত LOAD_PATH(রেলগুলির ক্ষেত্রে অটোলোড_পথ)। libরেলগুলি দ্বারা স্বয়ংক্রিয়ভাবে লোড না হওয়াতে ওটোলাইজড না হওয়াতে ওঠানামা করা হয়েছে এবং সাম্প্রতিক সংস্করণগুলিতে (> = রেল 3.x) এটি অটোলোড হয় না। আপনার জন্য যা কিছু ম্যাজিক এই কাজটি করছে তা বাঞ্ছনীয় নয়। সম্ভবত এটি একটি পুরানো রেলকাস্ট?
পিটার এইচ বোলিং

0

বিকাশ মোডে প্রতিটি অনুরোধের জন্য আপনার বানর প্যাচগুলি / এক্সটেনশানগুলি লোড করতে কনফিগারেশন.ট_প্রেপার ব্যবহার করুন।

config.to_prepare do |action_dispatcher|
 # More importantly, will run upon every request in development, but only once (during boot-up) in production and test.
 Rails.logger.info "\n--- Loading extensions for #{self.class} "
 Dir.glob("#{Rails.root}/lib/extensions/**/*.rb").sort.each do |entry|
   Rails.logger.info "Loading extension(s): #{entry}"
   require_dependency "#{entry}"
 end
 Rails.logger.info "--- Loaded extensions for #{self.class}\n"

শেষ

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