J'ai quelques difficultés ici, je n'arrive pas à appeler avec succès une méthode qui appartient à un ProjectPage
modèle dans le ProjectPage
contrôleur .
J'ai dans mon ProjectPage
contrôleur:
def index
@searches = Project.published.financed
@project_pages = form_search(params)
end
Et dans mon ProjectPage
modèle:
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
Cependant, je ne parviens pas à appeler avec succès le form_search
méthode.
Pour compléter la réponse de David, deux choses que vous faites mal sont:
1) vous appelez la fonction d'un modèle à partir d'un contrôleur, lorsque la fonction de modèle n'est définie que dans le modèle lui-même. Vous devez donc appeler
Project.form_search
et définir la fonction avec
def self.form_search
2) vous appelez des paramètres à partir du modèle. Dans l'architecture MVC, le modèle ne sait rien de la demande, donc params n'y est pas défini. Au lieu de cela, vous devrez passer la variable à votre fonction comme vous le faites déjà ...
Trois chose:
1.) Lorsque vous souhaitez créer une méthode à l'échelle de la classe qui ne se limite pas à un objet de la classe, vous devez la définir comme
def self.method_name
..
end
et pas
def method_name
...
end
2.) Cela peut être fait en utilisant un scope
avec lambda
ce sont vraiment de belles fonctionnalités. Comme ceci dans le modèle, ajoutez:
scope :form_search, lambda{|q| where("amount > ?", q) }
Vous permettra d'appeler
Project.form_search(params[:price_min])
La deuxième étape serait d'ajouter une portée au modèle ProjectPage
pour que tout soit à l'endroit auquel il appartient!
3.) Lorsque vous appelez une méthode de classe dans le contrôleur, vous devez spécifier le modèle comme ceci:
Class.class_method
Déclarez comme ceci dans le modèle
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
et appeler du contrôleur
@project_pages = ProjectPage.form_search(params)