2012-06-21 26 views
28

estoy tener algunas dificultades aquí, no soy capaz de llamar con éxito un método que pertenece a un modeloProjectPageen el controladorProjectPage.Llamar a un método en un modelo de controlador

que tengo en mi controlador de ProjectPage:

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

Y en mi modelo 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 

Sin embargo, no soy capaz de llamar con éxito el método form_search.

Respuesta

52

Para completar la respuesta de davidb, dos cosas que estás haciendo mal son:

1) está llamando a la función de un modelo desde un controlador, cuando la función del modelo solo está definida en el modelo en sí. Así que hay que llamar

Project.form_search 

y definir la función con

def self.form_search 

2) que está llamando parametros del modelo. En la arquitectura MVC, el modelo no sabe nada sobre la solicitud, por lo que params no está definido allí. En cambio, necesitarás pasar la variable a tu función como si ya estuvieras haciendo ...

+1

Gracias, el "yo" es lo que me faltaba – M090009

3

Declarar como esto en el modelo

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 

y llamar desde el controlador

@project_pages = ProjectPage.form_search(params) 
16

Tres cosa:

1.) Cuando se desea crear un método amplia clase eso no es limitado a un objeto de la clase que necesita para definirlo como

def self.method_name 
    .. 
end 

y no

def method_name 
    ... 
end 

2.) Esto se puede hacer usando un scope con lambda Estas son características muy agradable. Así en el modelo de complemento:

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

le permitirá llamar

Project.form_search(params[:price_min]) 

El paso secound sería añadir un margen para el modelo ProjectPage así que todo está en el lugar al que pertenece!

3.) Cuando se llama a un método de clase en el controlador que necesita para specifiy el Modelo de la siguiente manera:

Class.class_method 
Cuestiones relacionadas