2012-06-21 9 views
28

मैं कुछ कठिनाइयों यहाँ हूँ में एक मॉडल पद्धति को कॉल करें, मैं सफलतापूर्वक एक तरीका है जिसके ProjectPageनियंत्रक में एक ProjectPageमॉडल के अंतर्गत आता है कॉल करने में असमर्थ हूँ।एक नियंत्रक

मैं अपने ProjectPage नियंत्रक में है:

def index 
    @searches = Project.published.financed  
    @project_pages = form_search(params) 
end 

और मेरे ProjectPageमॉडल में:

def form_search(searches) 
    searches = searches.where('amount > ?', params[:price_min]) if check_params(params[:price_min]) 
    @project_pages = ProjectPage.where(:project_id => searches.pluck(:'projects.id')) 
end 

हालांकि, मैं सफलतापूर्वक form_searchविधि कॉल करने में असमर्थ हूँ।

उत्तर

52

davidb के जवाब पूरा करने के लिए, दो चीजें आप गलत कर रहे हैं कर रहे हैं:

1) आप एक मॉडल के फ़ंक्शन को नियंत्रक से कॉल कर रहे हैं, जब मॉडल फ़ंक्शन केवल मॉडल में ही परिभाषित किया जाता है। तो तुम

Project.form_search 

फोन और

def self.form_search 

2) आप मॉडल से परम कॉल कर रहे हैं के साथ समारोह परिभाषित करने की जरूरत है। एमवीसी आर्किटेक्चर में, मॉडल अनुरोध के बारे में कुछ नहीं जानता है, इसलिए पैरा को परिभाषित नहीं किया गया है। इसके बजाय, आपको वैरिएबल को अपने फ़ंक्शन में पास करने की आवश्यकता होगी जैसे कि आप पहले से ही कर रहे हैं ...

+1

धन्यवाद 'स्वयं' जो मैं खो रहा था – M090009

3

मॉडल

def self.form_search(searches) 
    searches = searches.where('amount > ?', params[:price_min]) if check_params(params[:price_min]) 
    @project_pages = ProjectPage.where(:project_id => searches.pluck(:'projects.id')) 
end 

में इस तरह घोषित और नियंत्रक से फोन

@project_pages = ProjectPage.form_search(params) 
16

तीन बात:

1.) आप एक वर्ग विस्तृत विधि बनानी हो तो यहीं तक सीमित नहीं thats वर्ग की एक वस्तु आप

def self.method_name 
    .. 
end 
की तरह इसे निर्धारित करना

और नहीं

def method_name 
    ... 
end 

2.) इस का उपयोग करते हुए lambda के साथ एक scope इन वास्तव में अच्छा विशेषताएं हैं किया जा सकता है। जैसा यह मॉडल ऐड में:

scope :form_search, lambda{|q| where("amount > ?", q) } 

ProjectPage मॉडल के लिए एक गुंजाइश जोड़ने के लिए secound कदम की जाएगी सक्षम हो जाएगा आप

Project.form_search(params[:price_min]) 

कॉल करने के लिए तो सब कुछ जगह यह के अंतर्गत आता है पर है!

3.) जब आप नियंत्रक में एक कक्षा विधि कॉल आप इस तरह मॉडल specifiy की जरूरत है:

Class.class_method 
संबंधित मुद्दे