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