2012-04-17 12 views
10

मैं ApplicationControllerकैसे मॉडल में ApplicationController में परिभाषित तरीकों

class ApplicationController < ActionController::Base 
    helper_method :get_active_gateway 
    def get_active_gateway(cart) 
    cart.account.gateways 
    end 
end 

में विधि को परिभाषित किया है जब मैं मॉडल

class Order < ActiveRecord::Base 
    def transfer 
    active= get_active_gateway(self.cart) 
    end 
end 

यह त्रुटि undefined local variable get_active_gateway फेंकने में इस विधि बोल रहा हूँ कॉल करने के लिए।

तो मैं

class Order < ActiveRecord::Base 
    def transfer 
    active= ApplicationContoller.helpers.get_active_gateway(self.cart) 
    end 
end 

लिखा तो यह error undefined method nil for Nilclass फेंक दिया गया था।

मैं रेल 3.2.0 में काम कर रहा हूं।

+2

जैसा कि दो उत्तरों ने कहा था, आपको अपने मॉडल से नियंत्रक विधियों को कॉल नहीं करना चाहिए। यह अनुशंसित नहीं है। मॉडल व्यू कंट्रोलर (एमवीसी) में पढ़ें। चीजों को स्वतंत्र रखने के लिए। मूल रूप से भंडारण के लिए मॉडल वार्ता, मॉडल के लिए नियंत्रक वार्ता (अन्य तरीकों से नहीं), और नियंत्रक को बातचीत देखें। –

+0

रेल डिज़ाइन के कारण, और ApplicationController.helpers (अब) को कॉल करने की क्षमता को हटाने के लिए, आपको मॉडल में डुप्लिकेट डीफ़ के साथ 'खुद को दोहराना' चाहिए। दोनों जगहों पर एक टिप्पणी जोड़ना सुनिश्चित करें ताकि यदि आप इसे एक बार में बदल दें, तो आपको जाना होगा और इसे दूसरे में बदलना होगा। – JosephK

उत्तर

6

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

यहां समान thread का एक लिंक है।

5

एक डिज़ाइन विकल्प के रूप में, आपके मॉडल से नियंत्रक हेल्पर्स को कॉल करने की अनुशंसा नहीं की जाती है।

आप केवल तर्क के रूप में अपने मॉडल विधियों के लिए आवश्यक विवरण पास कर सकते हैं।

 

def transfer(active_gateway) 
    active = active_gateway 
end 
संबंधित मुद्दे