2012-06-21 90 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)你調用從模型PARAMS定義功能。在MVC體系結構中,模型不知道任何有關請求的信息,因此在這裏沒有定義參數。相反,你需要將變量傳遞給你的函數,就像你已經在做的那樣...

+1

謝謝'self'就是我所缺少的 – 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)這可以使用與lambda一個scope這些都是非常好的功能來完成。像這樣的模型添加:

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

將使你打電話

Project.form_search(params[:price_min]) 

的謝勝利的步驟將是一個範圍添加到ProjectPage模型,使一切都在它屬於的地方!

3)當你調用的控制器類方法,你需要specifiy模型是這樣的:

Class.class_method