ruby-on-rails methods model controller instantiation

ruby on rails - Llamar a un método modelo en un controlador



ruby-on-rails methods (3)

Tengo algunas dificultades aquí, no puedo llamar con éxito a un método que pertenece a un modelo de ProjectPage en el controlador de ProjectPage .

Tengo en mi controlador ProjectPage :

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

Y en mi modelo de 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 puedo llamar con éxito al método form_search .


Declara así 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)


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í. Entonces necesitas llamar

Project.form_search

y define la función con

def self.form_search

2) estás llamando a params desde el 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 ...


Tres cosas:

1.) Cuando quieras crear un método para toda la clase que no esté limitado a un objeto de la clase, debes 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 realmente agradables. Me gusta Esto en el modelo agregar:

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

Te permitirá llamar

Project.form_search(params[:price_min])

¡El siguiente paso sería agregar un alcance al modelo de ProjectPage para que todo esté en el lugar al que pertenece!

3.) Cuando llame a un método de Clase en el Controlador, debe especificar el Modelo de esta manera:

Class.class_method