Jor*_*a T 2 ruby-on-rails ruby-on-rails-3
我有一个小问题需要了解我应该在哪里添加一个所有模型都可以访问它的方法.我读了其他类似的帖子,但不清楚在哪里添加它.他们中的一些人说关于将它添加到"/ lib"作为模块,然后将其包含在模型类中(已经尝试过这个没有运气).那么添加它的最佳做法是什么?
我正在尝试以下方法:
我的模块:/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
Run Code Online (Sandbox Code Playgroud)
在我的模型cars.rb
class Cars < ActiveRecord::Base
include Search
attr_accessible :name
end
Run Code Online (Sandbox Code Playgroud)
但我在我的控制台上收到以下错误:
在2012-08-01 11:56:54 -0500开始获取127.0.0.1的"/ cars"
ActionController :: RoutingError(未初始化的常量Car :: Search):app/models/car.rb:2:in''
任何帮助将不胜感激!:)
您提到的技术似乎是一种合理的方法 - 创建一个模块(可能存在/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
Run Code Online (Sandbox Code Playgroud)
然后在每个媒体模型中,我包括它:
class Video < ActiveRecord::Base
include Media
end
Run Code Online (Sandbox Code Playgroud)
然后我可以调用Video.first.do_something,就像在模型中定义了方法一样.
| 归档时间: |
|
| 查看次数: |
2389 次 |
| 最近记录: |