Подтвердить что ты не робот

Вызов метода модели в контроллере

У меня есть некоторые трудности здесь, я не могу успешно вызвать метод, который принадлежит модели 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.

4b9b3361

Ответ 1

Чтобы ответить на davidb, две вещи, которые вы делаете неправильно:

1) вы вызываете функцию модели с контроллера, когда функция модели определяется только в самой модели. Поэтому вам нужно позвонить

Project.form_search

и определите функцию с

def self.form_search

2) вы вызываете params из модели. В архитектуре MVC модель ничего не знает о запросе, поэтому параметры там не определены. Вместо этого вам нужно передать переменную в вашу функцию, как вы уже делаете...

Ответ 2

Три вещи:

1.) Когда вы хотите создать метод класса, который не ограничивается объектом класса, вам нужно определить его как

def self.method_name
  ..
end

а не

def method_name
  ...
end

2.) Это можно сделать с помощью scope с lambda, это действительно приятные функции. Подобно этому в модели добавьте:

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

Позволяет вам звонить

Project.form_search(params[:price_min])

Отступным шагом будет добавление области в модель ProjectPage, поэтому все будет в том месте, где оно принадлежит!

3.) Когда вы вызываете метод класса в контроллере, вам необходимо указать модель следующим образом:

Class.class_method

Ответ 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)