2012-06-21 15 views
28

Sono avere qualche difficoltà qui, non sono in grado di chiamare con successo un metodo che appartiene a un modelloProjectPagenel controllerProjectPage.Chiamare un metodo di modello in un controller

ho nel mio controller ProjectPage:

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

E nel mio modelloProjectPage:

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 

Tuttavia, sono in grado di chiamare con successo il metodoform_search.

risposta

52

Per completare la risposta di davidb, due cose che stai facendo male sono:

1) stai chiamando la funzione di un modello da un controller, quando la funzione modello è definita solo nel modello stesso. Così si ha bisogno di chiamare

Project.form_search 

e definire la funzione con

def self.form_search 

2) che si sta chiamando params dal modello. Nell'architettura MVC, il modello non conosce nulla sulla richiesta, quindi i parametri non sono definiti lì. Invece, dovrai passare la variabile alla tua funzione come stai già facendo ...

+1

Grazie al 'self' è quello che mi mancava – M090009

3

Dichiarare come questo nel modello

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 

e chiamare dal regolatore

@project_pages = ProjectPage.form_search(params) 
16

Tre cosa:

1.) Quando si desidera creare un metodo un'ampia classe thats non limitato a un oggetto della classe è necessario definirlo come

def self.method_name 
    .. 
end 

e non

def method_name 
    ... 
end 

2.) Questo può essere fatto utilizzando un scope con lambda queste sono caratteristiche davvero belle. Like This nel modello aggiuntivo:

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

vi permetterà di chiamare

Project.form_search(params[:price_min]) 

Il passo secound sarebbe quello di aggiungere un ambito al modello ProjectPage quindi tutto è al posto a cui appartiene!

3.) Quando si chiama un metodo di classe nel controller è necessario specifiy il modello come questo:

Class.class_method 
Problemi correlati