web-dev-qa-db-fra.com

Appeler une méthode de modèle dans un contrôleur

J'ai quelques difficultés ici, je n'arrive pas à appeler avec succès une méthode qui appartient à un ProjectPagemodèle dans le ProjectPagecontrôleur .

J'ai dans mon ProjectPage contrôleur:

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

Et dans mon ProjectPagemodè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_searchméthode.

36
sidney

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à ...

62
ben

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
19
davidb

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)
3
Kashiftufail