Call a model method in a Controller

2019-03-09 00:07发布

I'm have some difficulties here, I am unable to successfully call a method which belongs to a ProjectPage model in the ProjectPage 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.

3条回答
我想做一个坏孩纸
2楼-- · 2019-03-09 00:42

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)
查看更多
Animai°情兽
3楼-- · 2019-03-09 00:43

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...

查看更多
仙女界的扛把子
4楼-- · 2019-03-09 00:49

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
查看更多
登录 后发表回答