将方法从控制器移动到模型

时间:2013-03-01 22:26:44

标签: ruby-on-rails ruby ruby-on-rails-3.2

根据几个人的建议,我被告知要让控制器尽可能简洁。目前我在我的控制器中有这个:

class SearchesController < ApplicationController
  def index
    raw_result = params[:search] ||= "man on fire"
    result = raw_result.gsub(/\s+/, "+")
    movie_details = HTTParty.get("http://imdbapi.org/?title="+result+"&type=json")
    @searches = ActiveSupport::JSON.decode(movie_details)
  end
end

如何在模型中将其转换为新类并在控制器中再次回调它?

当前型号和控制器:

class IMDBSearcher
  def self.search(search)
    raw_result = search || "man on fire"
    result = raw_result.gsub(/\s+/, "+")
    movie_details = HTTParty.get("http://imdbapi.org/?title="+result+"&type=json")

    ActiveSupport::JSON.decode(movie_details)      
  end
end

class SearchesController < ApplicationController
  def index
    @searches = IMDBSearcher.search(params[:search]) 
  end
end

1 个答案:

答案 0 :(得分:1)

如果是实例方法,你可以这样称呼它:

instance.search(something)

如果是类方法,则将其称为:

IMDBSearcher.search(something)

但是,要做到这一点,你必须像这样创建你的方法:

def self.search(raw_result)

这里的技巧是使用self关键字,在类方法中转换方法(因为self在这里是IMDBSearcher类)。例如:

def self.search(search)
  raw_result = search || "man on fire"
  result = raw_result.gsub(/\s+/, "+")
  movie_details = HTTParty.get("http://imdbapi.org/?title="+result+"&type=json")

  ActiveSupport::JSON.decode(movie_details)      
end

在控制器中,您可以执行以下操作:

@searches = IMDBSearcher.search(params[:search])