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