2012-06-21 4 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) вы вызываете параметры из модели. В архитектуре MVC модель ничего не знает о запросе, поэтому параметры там не определены. Вместо этого вам нужно передать переменную в вашу функцию, как вы уже делаете ...

+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.) Если вы хотите создать широкий метод класса это еще не ограничено объект класса, который вы должны определить, например

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]) 

secound шаг будет добавить объем к ProjectPage модели, так что все находится в месте, которое он принадлежит!

3.) При вызове метода класса контроллера необходимо specifiy Модели, как это:

Class.class_method 
Смежные вопросы