Call a model method in a Controller
Solution 1
To complete davidb's answer, two things you're doing wrong are:
1) you're calling a model's function from a controller, when the model function is only defined in the model itself. So you do need to call
Project.form_search
and define the function with
def self.form_search
2) you're calling params from the model. In the MVC architecture, the model doesn't know anything about the request, so params is not defined there. Instead, you'll need to pass the variable to your function like you're already doing...
Solution 2
Three thing:
1.) When you want to create a class wide method thats not limited to an object of the class you need to define it like
def self.method_name
..
end
and not
def method_name
...
end
2.) This can be done using a scope
with lambda
these are really nice features. Like This in the model add:
scope :form_search, lambda{|q| where("amount > ?", q) }
Will enable you to call
Project.form_search(params[:price_min])
The secound step would be to add a scope to the ProjectPage
model so everything is at the place it belongs to!
3.) When you call a Class method in the Controller you need to specifiy the Model like this:
Class.class_method
Solution 3
Declare like this in model
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
and call from controller
@project_pages = ProjectPage.form_search(params)
sidney
Rails developer, software scientist, and admirator of the great Penguin
Updated on July 09, 2022Comments
-
sidney almost 2 years
I'm have some difficulties here, I am unable to successfully call a method which belongs to a
ProjectPage
model in theProjectPage
controller.I have in my
ProjectPage
controller:def index @searches = Project.published.financed @project_pages = form_search(params) end
And in my
ProjectPage
model: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
However, I am unable to successfully call the
form_search
method. -
M090009 about 8 yearsThanks the
self
is what i was missing