10

class_eval और मॉड्यूल (विरासत द्वारा नहीं) के माध्यम से कक्षा व्यवहार को बढ़ाने का अनुशंसित तरीका क्या है यदि मैं एक रेल 3 एप से जेम में दफन की गई कक्षा का विस्तार करना चाहता हूं?रेल 3 में जेम क्लासेस (क्लास_वेल और मॉड्यूल के माध्यम से) कैसे/कब/कहां विस्तारित करें?

एक उदाहरण यह है:

मैं टैग और श्रेणियों के लिए पर्मालिंक्स बनाने की क्षमता जोड़ना चाहते हैं (ActsAsTaggableOn और ActsAsCategory जवाहरात के माध्यम से)।

उन्होंने Tag और Category मॉडल परिभाषित किए हैं।

मैं मूल रूप से ऐसा करना चाहते हैं:

Category.class_eval do 
    has_friendly_id :title 
end 

Tag.class_eval do 
    has_friendly_id :title 
end 

यहां तक ​​कि अगर वहाँ इस कार्यशीलता कि मणि में हो सकती है जोड़ने के अन्य तरीके हैं, एक रेल 3 में कक्षाओं के लिए व्यवहार को जोड़ने के लिए सुझाया गया तरीका क्या है इस तरह का आवेदन?

मेरे पास कुछ अन्य रत्न हैं जिन्हें मैंने बनाया है, मैं इसे Configuration मॉडल और Asset मॉडल जैसे करना चाहता हूं। मैं अपने ऐप में app/models/configuration.rb मॉडल क्लास बनाने में सक्षम होना चाहता हूं, और ऐसा लगता है जैसे मैंने अभी class_eval किया है।

वैसे भी, यह कैसे काम करना चाहिए? मुझे कुछ भी नहीं मिल रहा है जो किसी भी मौजूदा रेल 3 ब्लॉग/डॉक्स/गिस्ट से इसे कवर करता है।

उत्तर

9

मैं यह करने के रूप में निम्न प्रकार है, पहले/initializers विन्यास के लिए जहाँ आप फ़ाइलों को अपने एक्सटेंशन को शामिल कर सकते हैं की आवश्यकता होती है एक फ़ाइल जोड़ें:

# config/initializers/extensions.rb 
require "#{Rails.root}/app/models/category.rb" 
require "#{Rails.root}/app/models/tag.rb" 

तो फिर तुम सिर्फ कक्षाओं को फिर से खोलने और जोड़ सकते हैं आप जो कुछ भी की जरूरत है:

# app/models/category.rb 
class Category 
    has_friendly_id :title 
end 

केवल नकारात्मक पक्ष यह सर्वर प्रभाव, यकीन नहीं अगर वहाँ एक बेहतर तरीका है कि उस पर काबू पाने होता है लेने के लिए इन फ़ाइलों में कोई भी परिवर्तन के लिए पुन: प्रारंभ करने की गई है।

+0

मेरे पास एक ही समस्या है, मुझे 'लोडरर: अपेक्षित ऐप/मॉडल/टैग.आरबी' टैग ' – MhdSyrwan

+0

एमडीएचएसआईआरवान परिभाषित करने के लिए मिलता है: इसका मतलब है कि आपकी' टैग.आरबी 'फ़ाइल के अंदर, परिभाषित करने वाली पहली कक्षा को कॉल किया जाना चाहिए बिल्कुल "टैग", तो ऐसा लगता है कि आपने अभी इसे सही तरीके से नामित नहीं किया है। –

0

आप rails_engine_decorator उपयोग कर सकते हैं मणि: https://github.com/atd/rails_engine_decorators

बस अपने Gemfile में जोड़ें:

gem 'rails_engine_decorator' 

और उपयोगकर्ता class_eval अपने सज्जाकार में:

/app/decorators/models/category_decorator.rb 
/app/decorators/models/tag_decorator.rb 

यह मेरे लिए काम करता है। मुझे उम्मीद है कि आप इसे उपयोगी पाएँ!

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