রেল / লিবি মডিউল এবং


83

আমি open_flash_chartপ্লাগইনটির জন্য একটি কাস্টম মোড়ক লিখছি । এটি স্থাপন করা হয়েছে /libএবং এটিকে মডিউল হিসাবে লোড করুন ApplicationController

তবে আমার কিছু শ্রেণিবদ্ধতা বা স্মেথ সমস্যা আছে।

কোন নিয়ামক থেকে আমি অ্যাক্সেস করতে পারেন open_flash_chartহিসাবে ফাংশন OpenFlashChart, Lineইত্যাদি

যাইহোক, একটি /libমডিউল একটি ক্লাসে , এটি কাজ করে না!

কোন ধারনা?


আশা করি এই সাহায্য করতে পারেন stackoverflow.com/questions/17304110/...
S.Yadav

উত্তর:


147

রেলগুলিতে ফাইলগুলি লোড হওয়ার দুটি উপায় রয়েছে:

  • এটি অটোল্যাড প্রক্রিয়াতে নিবন্ধীকৃত এবং আপনি ফাইলের নামের সাথে মিলে একটি ধ্রুবক উল্লেখ করেন। উদাহরণস্বরূপ, যদি আপনার কাছে app/controllers/pages_controller.rbপৃষ্ঠাগুলি নিয়ন্ত্রণকারী এবং রেফারেন্স থাকে app/controllers/pages_controller.rbতবে স্বয়ংক্রিয়ভাবে লোড হবে। লোড পাথের ডিরেক্টরিগুলির পূর্বনির্ধারিত তালিকার জন্য এটি ঘটে। এটি রেলগুলির একটি বৈশিষ্ট্য এবং এটি সাধারণ রুবি লোড প্রক্রিয়াটির অংশ নয়।
  • ফাইলগুলি স্পষ্টভাবে requireডি। যদি কোনও ফাইল requireডি হয়, রুবি আপনার লোড পাথগুলির সমস্ত পাথের তালিকাটি সন্ধান করে এবং আপনার requireডি ফাইলটি লোডের পথে প্রথম ক্ষেত্রে সন্ধান করবে। আপনি load LOAD_PATH (alias :) এর জন্য একটি উপাধি) পরিদর্শন করে পুরো লোড পাথটি দেখতে পাবেন।

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

আমি আরও লক্ষ্য করেছি যে আপনি অন্য কোনও বিষয় সম্পর্কে বিভ্রান্ত হতে পারেন। অ্যাপ্লিকেশন কন্ট্রোলার সিস্টেমের মূল উপাদান নয় । পর্যবেক্ষণ:

module MyModule
  def im_awesome
    puts "#{self} is so awesome"
  end
end

class ApplicationController < ActionController::Base
  include MyModule
end

class AnotherClass
end

AnotherClass.new.im_awesome
# NoMethodError: undefined method `im_awesome' for #<AnotherClass:0x101208ad0>

মডিউলটি আপনি যে শ্রেণিতে এটি ব্যবহার করতে চান তা অন্তর্ভুক্ত করতে হবে।

class AnotherClass
  include MyModule
end

AnotherClass.new.im_awesome
# AnotherClass is so awesome

অবশ্যই, প্রথম স্থানে মডিউলটি অন্তর্ভুক্ত করতে সক্ষম হওয়ার জন্য আপনার এটিকে উপলব্ধ করতে হবে (উপরের কৌশলগুলির কোনওটি ব্যবহার করে)।


4
কেবল যোগ করতে চেয়েছিলেন: / লিবিতে আপনার কোনও মডিউল যদি (বা অটোলোড ডিরেক্টরিগুলির একটিতে) ইতিমধ্যে সংজ্ঞায়িত থাকে; অ্যাক্টিভেকর্ড বা স্ট্রিং আপনাকে ওভারলোডের উদাহরণ দেয়, আপনাকে স্পষ্টভাবে এটি প্রয়োজন হবে বা এটি লোড করা হবে না
মাইক

4
আশ্চর্যের সাথে, আমি পাচ্ছি: অবিচ্ছিন্ন ধ্রুবক গ্যাক্লিয়েন্ট (নামেরর), যদি না আগে আমার 'ga_client' প্রয়োজন হয় (ক্লাসটি lib / ga_client.rb এ সংজ্ঞায়িত করা হয়)। অটোল্যাড নামকরণ প্রকল্পের জন্য কী ডকুমেন্টেশন আছে?
mkirk

87

কারাগারে 3 / lib মডিউলগুলি স্বয়ংক্রিয়ভাবে লোড হয় না।

লাইনটি কারণ:

# config.autoload_paths += %W(#{config.root}/extras)

ভিতরে কনফিগার / অ্যাপ্লিকেশন.আরবি মন্তব্য করা হয়।

আপনি এই লাইনটি uncomment করার চেষ্টা করতে পারেন বা (এটি আমার পক্ষে আরও ভাল কাজ করেছে), এই মন্তব্যটি ছেড়ে (ভবিষ্যতের রেফারেন্সের জন্য) এবং এই দুটি লাইন যুক্ত করুন:

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

এটি অ্যারেতে সদৃশ ../libপথ তৈরি করবে ApplicationName::Application.config.autoload_paths
jibiel

4
@ জিবিল তাই এখানে রেজোলিউশন কি?

4
পরের বিকল্পটি আপনার পক্ষে কেন আরও ভাল কাজ করেছে? এছাড়াও, কেন ডিফল্ট পরিবর্তন করা হয়েছিল ... প্রচুর লোকেরা আশেপাশে কাজ সন্ধান করার পরেও একটি কারণ থাকতে হবে।
ckarbass

@ ইলুমিনেট তাই একক config.autoload_paths += Dir["#{config.root}/lib/**/"]যথেষ্ট হওয়া উচিত। @ কার্ববাস দ্বিতীয় লাইন আপনাকে আপনার ইউটিলিটিগুলিকে সাবফোল্ডারগুলিতে সংগঠিত করার এবং আপনার মডিউলটিকে নাম- স্পেসের সাহায্যে সুন্দর করার স্বাধীনতা দেয় । যে প্রায় কাছাকাছি এটা. এবং এখানেই কেন ডিফল্ট পরিবর্তন করা হয়েছিল। আগের চেয়ে বেশি দেরী :)
জিবিল

এটি আমার কাছে কিছুটা অগোছালো মনে হচ্ছে। এই অকারণে অটো-লোড রাক কাজগুলি করবে না?
ডেনিস

22

অসাধারণ কনফিগারেশন ছাড়াও আমার পক্ষে কী কাজ করেছে a

#config/initializers/myapp_init.rb
require 'my_module'    
include MyModule

এইভাবে আমি যে কোনও জায়গা থেকে ক্লাসের পদ্ধতি Model.mymodule_methodবা উদাহরণ পদ্ধতি হিসাবে মাইমডিউল পদ্ধতিগুলি কল করতে পারিmymodel.mymodule_method

হতে পারে কিছু বিশেষজ্ঞ এর এর প্রভাবগুলি ব্যাখ্যা করতে পারেন। এখনই এটি আপনার নিজের ঝুঁকিতে ব্যবহার করুন।

সম্পাদনা: এরপরে, আমি মনে করি আরও ভাল উত্সাহ হবে:

এটির মতো একটি প্রাথমিককরণ তৈরি করুন:

#config/initializers/myapp_init.rb
require ‘my_module’

প্রয়োজন মতো মডিউলটি অন্তর্ভুক্ত করুন:

1) আপনি যদি এটি "শ্রেণিবদ্ধ পদ্ধতি" হিসাবে "প্রসারিত" ব্যবহার করতে চান:

class Myclass < ActiveRecord::Base
   extend MyModule
   def self.method1
      Myclass.my_module_method
   end
end

2) আপনি যদি এটি "ইনস্ট্যান্স পদ্ধতি" হিসাবে ব্যবহার করতে চান তবে এটি ক্লাস সংজ্ঞায় অন্তর্ভুক্ত করুন:

class Myclass < ActiveRecord::Base
include MyModule
   def method1
      self.my_module_method 
   end
end

3) মনে রাখবেন যে আপনার বোঝার পথে এমন include MyModuleকোনও ফাইলকে বোঝায় my_module.rbযা প্রথমে প্রয়োজনীয় হতে হবে


4
আমি আমার মডিউল তৈরি করেছেন libফোল্ডার অতএব, আমি যোগ করেছি config.autoload_paths += %W(#{config.root}/lib)উপর config/application.rbফাইল। এর পরে আমি config/initializers/myapp_init.rbফাইল যুক্ত করার পরামর্শ এবং এর বিষয়বস্তু অনুসরণ করেছি। সবকিছু ভাল. অনেক অনেক ধন্যবাদ :)
এসএমমোসাভি

যদিও requireআমার পক্ষে কাজ করে এবং অটো-লোডিং (অপরিজ্ঞাত মডিউল পদ্ধতি) না করে, এই মন্তব্যটি আপনাকে ব্যবহার করা উচিত নয়require
ডেনিস

3

lib/my_module.rbআপনার মডেল এবং নিয়ন্ত্রণকারীগুলিতে মডিউলটি ব্যবহার করতে :

ইন config/application.rb:

config.watchable_dirs['lib'] = [:rb]

আপনার মডেলটিতে (আপনার নিয়ামকের জন্য একই ধারণা):

require_dependency 'my_module'

class MyModel < ActiveRecord::Base
  include MyModule

  MyModule.some_method
end

এই পদ্ধতিটি http://hakunin.com/rails3-load-paths এ আরও বিশদে বর্ণনা করা হয়েছে


0

এটি এমন ক্ষেত্রে হতে পারে যে আপনি অ্যাপ্লিকেশন শুরু করার সময় স্পষ্টতই lib ডিরেক্টরিতে ফাইল (গুলি) লোড করতে চান।
আমার কনফিগারেশন / অ্যাপ্লিকেশন.আরবি তে আমার যেমন একটি এন্ট্রি রয়েছে,
config.autoload_paths += %W(#{config.root}/lib)

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

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