2010-10-15 12 views
27

मेरे पास मेरे नियंत्रक में कुछ व्यवहार है कि मैंने कुछ मॉड्यूल में बेहतर परीक्षण और पुन: उपयोग करने के लिए मॉड्यूल में खींच लिया है। इसके बारे में दो प्रश्न:मैं रेल 3 में अपने नियंत्रकों में मिश्रित या मॉड्यूल का उपयोग कैसे कर सकता हूं?

  1. मेरे मॉड्यूल लगाने के लिए एक अच्छी जगह कहां है? उन्हें नियंत्रकों के लिए उपलब्ध होने के लिए चलाने की आवश्यकता है, इसलिए मैं config/initializers/ निर्देशिका सोच रहा था। हालांकि मुझे थोड़ा सा संदेह लगता है। lib/?
  2. मैं कैसे सुनिश्चित करूं कि कोड चलाया जाए ताकि मॉड्यूल मेरे नियंत्रकों में include पर उपलब्ध हो?

धन्यवाद कृपया श्रीमान।

उत्तर

38
  1. lib/ मॉड्यूल के लिए एक उत्कृष्ट जगह है; config/initializers/ से कम बेहतर - मेरी राय में कम से कम। यदि यह कई मॉड्यूल हैं, या एक बड़ा है, तो आप इसे एक प्लगइन बनाने और इसे vendor/plugins में रखने पर भी विचार कर सकते हैं।

  2. यदि आप इसे lib/ में डालते हैं, तो आपको फ़ाइल को मैन्युअल रूप से require फ़ाइल की आवश्यकता होगी। रेल, डिफ़ॉल्ट रूप से, lib/ निर्देशिका में फ़ाइलों को स्वत: लोड नहीं करता है। आप अपनी कॉन्फ़िगरेशन फ़ाइलों में से एक में आवश्यकताएं रख सकते हैं।

मैं आमतौर पर config/application.rb में अपने अतिरिक्त ऑटोलोड लोड करता हूं। इस चाल करना चाहिए की तरह कुछ (यह मानते हुए कि आपके .rb फ़ाइल एक निर्देशिका lib/my_module कहा जाता है):

config.autoload_paths += Dir["#{Rails.root}/lib/my_module"] 

आप सुनिश्चित करें कि आपके मॉड्यूल एक वास्तविक module और नहीं एक class है बनाने के लिए किया है। फिर, आप बस इसे शामिल कर सकते हैं:

# lib/my_module/foobar.rb 
module Foobar 
    def foobar 
    "Hello world!" 
    end 
end 

# app/models/my_model.rb 
class MyModel < ActiveRecord::Base 
    include Foobar 
end 

# rails console 
>> obj = MyModel.first 
=> #<MyModel id: 1, ...> 
>> obj.id 
=> 1 
>> obj.foobar 
=> "Hello world!" 
-1

app/controllers में नियंत्रक विशिष्ट मॉड्यूल डालने की कोशिश करो। नहीं require आवश्यक है। एप्लिकेशन/एक्सटेंशन के तहत मेरी मॉड्यूल/ऐप्स/mixins के तहत /ऐप्स/सेवाओं के तहत अपनी सेवाओं

2) आप के सभी लोड करने के लिए अपने आवेदन कॉन्फ़िगर कर सकते हैं मेरी कक्षा एक्सटेंशन:

+10

जब तक कि वे नियंत्रक न हों, उन्हें 'ऐप/नियंत्रकों' में नहीं जाना चाहिए। यह निर्देशिका संरचना के उद्देश्य को हरा देता है। – jergason

+0

सहमत हैं, अरबिंद ठाकुर का समाधान सबसे अच्छा है। मैं/lib का प्रशंसक नहीं हूं क्योंकि बड़ी परियोजनाओं में जो निश्चित रूप से अनावश्यक हो सकता है। नीचे पदानुक्रम के साथ ऐप/मिक्सर जो हम करेंगे सबसे अधिक संभावना है। – jwg2s

1

1) मैं रखना चाहते हैं इन config/application.rb में: वर्ग एक्सटेंशन सही तरीके से आवश्यक होना चाहिए और mixins और सेवाओं अपने autoload पथ में जोड़ा जा सकता

(रेल मैं उपयोग कर रहा हूँ 3)
class Application < Rails::Application 
    # require class extentions right now 
    Dir[Rails.root.join('app', 'extentions', "*.rb")].each {|l| require l } 

    # Custom directories with classes and modules you want to be autoloadable. 
    config.autoload_paths += Dir[Rails.root.join('app', 'mixins', '{**}')] 
    config.autoload_paths += Dir[Rails.root.join('app', 'services', '{**}')] 

संबंधित मुद्दे

 संबंधित मुद्दे