रूबी 3 पर रूबी का उपयोग करके एक मॉड्यूल कैसे बनाएं और उपयोग करें?


90

मैं रेल 3 पर रूबी का उपयोग कर रहा हूं और मैं एक मॉड्यूल में कुछ कस्टम और साझा कोड को स्थानांतरित करना चाहूंगा।

  1. मॉड्यूल कोड लिखने के लिए मुझे किस सिंटैक्स का उपयोग करना चाहिए?
  2. मेरे एप्लिकेशन के किस फ़ोल्डर में मुझे मॉड्यूल फ़ाइल रखनी है?
  3. मुझे उस मॉड्यूल को एक या अधिक नियंत्रक कक्षाओं में कैसे शामिल करना है?
  4. क्या अन्य कार्रवाई, यदि कोई हो, क्या मुझे अपने आवेदन में कहीं भी कस्टम मॉड्यूल का उपयोग करना होगा?
  5. मैं अपने एप्लिकेशन से मॉड्यूल में तरीके कैसे कह सकता हूं?

अग्रिम में धन्यवाद।


2
बहुत अच्छा! मुझे यह चाहिए था।
अरूप रक्षित

जवाबों:


115

1. एक मॉड्यूल बनाया है / बस कह कर खोला:

module MyModule
  def first_module_method
  end
end

टू 2. libफोल्डर। यदि आप अपने मॉड्यूल को libफ़ोल्डर में व्यवस्थित करना चाहते हैं , तो आप उन्हें स्वयं मॉड्यूल में डाल सकते हैं। उदाहरण के लिए, यदि आप एक सबफ़ोल्डर चाहते थे तो super_modulesआपके मॉड्यूल निम्नानुसार परिभाषित किए जाएंगे:

module SuperModules
  module MyModule
    def first_module_method
    end
  end
end

3./5 पर। एक वर्ग में मॉड्यूल को शामिल करते समय आप बस मॉड्यूल विधियों को कॉल कर सकते हैं जैसे कि उन्हें कक्षा के भीतर परिभाषित किया गया था:

class MyClass
  include MyModule
  def some_method
    first_module_method #calls module method
  end
end

4. फ्रॉस्ट के लिए, सुनिश्चित करें कि आपके मॉड्यूल को आपके आवेदन के प्रत्येक वर्ग में वास्तव में आवश्यक है। यदि ऐसा नहीं है, तो इसका मतलब केवल इसे शामिल करना है जहां यह आवश्यक है ताकि वर्गों को ब्लोट न करने की आवश्यकता है जो इसे वैसे भी ज़रूरत नहीं है। यदि आप वास्तव में हर जगह मॉड्यूल चाहते हैं, तो ऐप में अपनी कक्षाओं के वर्ग पदानुक्रम को देखें। क्या आप सभी मॉडलों में मॉड्यूल चाहते हैं? आप ActiveRecord :: Base खोल सकते हैं और वहां अपना मॉड्यूल जोड़ सकते हैं।


2
ऑर्गनाइज फाइल्स के लिए, क्या मैं 'लिब' फोल्डर में सब-फोल्डर बना सकता हूं? यदि हां, तो क्या बदलता है?
user502052

2
@ user502052 मैंने उस प्रश्न का उत्तर देने के लिए बिंदु 2 के उत्तर को अपडेट किया है।
Stephan

3
यहां कई चीजें अस्पष्ट हैं। क्या फ़ाइल नाम देने के लिए? सभी मॉड्यूल शामिल नहीं होने पर तरीकों को कैसे कॉल करें? मुझे विश्वास नहीं हो रहा है कि बहुत सारे अपवित्र हैं क्योंकि मैं अभी भी नहीं जानता कि अंत में एक मॉड्यूल का उपयोग कैसे करें।
ऑगस्टिन रिडिंगर

5
एक बार जब आप libफ़ोल्डर में इसे शामिल करके ऊपर के रूप में एक मॉड्यूल बनाते हैं , तो एक महत्वपूर्ण नोट होता है Rails3 को लाइन को अनकंफर्ट करने में सक्षम करने के config\application.rbलिए config.autoload_paths- जैसे पढ़ें, stackoverflow.com/questions/1073076/rails-lib-modules.and ... नोट यह भी कि आपको अपने मॉड्यूल के लिए एक फ़ाइल नाम का उपयोग करने के लिए सावधान रहना होगा जो मॉड्यूल नाम से ही मेल खाता है। इसलिए यदि आप इसे सहेजते हैं lib/test/my_module.rb, तो आपको करना होगा include Test::MyModule- अधिक जानकारी के लिए stackoverflow.com/questions/4073856/rails-3-autoload
sameers

6
मुझे बस मेरा यह पुराना उत्तर मिला। :( मैं डाउनवोट करना चाहता हूं। कुछ भी लिब में न डालें। अपने कोड को (अतिरिक्त मॉड्यूल सहित) डालें app/modelsयदि कोड को अन्य मॉडलों की आवश्यकता है। यदि आपका कोड वास्तव में एक 'लाइब्रेरी' है और अपने आप ही मौजूद हो सकता है, तो मैं एक मणि को सत्यापित करने का सुझाव दें। उदाहरण के लिए, github.com/shageman/the_next_big_thing
Stephan

3

A> 1। आप किसी अन्य रूबी वर्ग के समान सिंटैक्स का उपयोग कर सकते हैं। उदाहरण के लिए, मैं व्हीकलक्लासिफर मॉड्यूल को परिभाषित कर रहा हूं जो कि एक इनपुट के रूप में प्राप्त होने वाले पहियों के आधार पर वाहन को वर्गीकृत करने के लिए classify_vehicle विधि का उपयोग करने जा रहा है।

module VehicleClassifer
  def classify_vehicle(number_of_wheels)
    VehicleType.where("number_of_wheels = ?", number_of_wheels)
  end
end

एक> 2। मॉड्यूल आमतौर पर / lib फ़ोल्डर में संग्रहीत होते हैं।

प्रश्न 3,4,5 में कमोबेश एक ही उत्तर है। आप उपयोग कर सकते हैं

class SomeController < ApplicationController
  include VehicleClassfier

  def index 
    classify_vehicle(4)  
  end
end

जिस कक्षा में आप मॉड्यूल का उपयोग कर रहे हैं और आपके पास मॉड्यूल के सभी तरीकों तक पहुंच होगी।

इसके अलावा, यदि आपको अपने ऐप के माध्यम से मॉड्यूल का उपयोग करने की आवश्यकता है, तो आप इसे अपने एप्लिकेशन कंट्रोलर में शामिल कर सकते हैं।


2
मैंने यह कोशिश की और एक अपरिभाषित विधि त्रुटि मिली। क्या मैं गलत कर रहा हूँ के किसी भी विचार?
टोनी

क्या आप सुनिश्चित हैं कि आपका मॉड्यूल सुलभ है? stackoverflow.com/questions/6604272/… शायद आपकी मदद करे?
श्रेयस

1
@Tony - आपको अपने सर्वर को पुनः आरंभ करने की आवश्यकता हो सकती है - यहां तक ​​कि देव-मोड में भी, मॉड्यूल के तरीके उपलब्ध होने के लिए। और हर बार जब आप अपने मॉड्यूल में कोड बदलते हैं, तो आपको सर्वर को फिर से शुरू करना होगा। उदाहरण के लिए, यदि कोई त्रुटि है, या यह पुराने कोड पर त्रुटि करेगा, लेकिन त्रुटि संदेश में उस पंक्ति पर नए कोड को हाइलाइट करें - बहुत भ्रमित।
जोसेफ

किसी भी विचार को कैसे शामिल करें और उन कस्टम मॉड्यूल का उपयोग करें ApplicationHelper?
WM
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.