2012-08-01 46 views
2

我有一個小問題來了解應該在哪裏添加所有模型都可以訪問的方法。我讀過其他類似的帖子,但不清楚在哪裏添加它。他們中的一些人說將它作爲模塊添加到「/ lib」中,然後將它包含在模型類中(已經嘗試過,但沒有運氣)。那麼添加它的最佳做法是什麼?RoR - 適用於所有型號的全局方法

我想以下幾點:

我的模塊:/lib/search.rb

module Search  
    def self.search(params,columns_search) 
     srch = params[:search] 

     if srch.blank? 
      scoped 
     else 
      search= [] 
      #Add conditions for the search 
      columns_search.map do |column| 
      search << (sanitize_sql_for_conditions ["LOWER(CAST(#{column} as TEXT)) LIKE ?", "%#{srch.downcase}%"]) 
     end 

      where("(#{conditions.join(" and ")})") 

    end 
end 

在我的模型cars.rb

class Cars < ActiveRecord::Base 
    include Search 

    attr_accessible :name 

end 

但我的控制檯出現以下錯誤:

Started GET "/cars" for 127.0.0.1 at 2012-08-01 11:56:54 -0500

ActionController::RoutingError (uninitialized constant Car::Search): app/models/car.rb:2:in `'

任何幫助將不勝感激! :)

回答

6

您提到的技術看起來像是一種合理的方法 - 創建一個模塊(可能生活在/lib),該模塊定義您希望模型具有的方法,然後將其包含在每個需要它的模型中。

例如,我目前的項目有圖片,視頻和音頻,所有這些方法都應該有一定的方法,因爲它們是所有類型的媒體。 我lib/media.rb定義模塊:

module Media 
    def self.included(base) 
    # Associations etc. go here 
    base.has_many :things 
    base.mount_uploader :image, ImageUploader 
    base.attr_accessible :image 
    base.before_save :do_something 
    end 

    def do_something(argument=nil) 
    #stuff 
    end 

end 

然後在各媒體模式,我把它給:

class Video < ActiveRecord::Base 
    include Media 

end 

我可以調用Video.first.do_something,就好像方法是在定義模型。

+0

感謝您的回答,現在即時通訊以這種方式嘗試,但問題是,我得到了下一個錯誤:ActionController :: RoutingError(未初始化的常量Cars ::搜索)。我應該添加一條新路線,或者我應該錯過嗎? – 2012-08-01 17:01:19

+0

我不確定爲什麼這是一個'RoutingError',但如果您在某處指的是Cars :: Search,那麼這是不正確的 - 您不需要調用在Search中定義的方法一個「汽車」對象。 – MrTheWalrus 2012-08-01 17:37:18

相關問題