我创建了一个包含在类中的模块。在模块中,我试图定义一个方法,它是没有过滤器的类名的小写版本。所以 ShowFilter 会有一个名为 show 的方法,它返回类 Show。我得到“NoMethodError:ShowFilter:Class 的未定义方法‘show’”
module Filters
module Base
module ClassMethods
@@filters = {}
def filter name, &block
@@filters[name] = block
end
def run query = {}
query.each do |name, value|
@@filters[name.to_sym].call(value) unless @@filters[name.to_sym].nil?
end
self
end
def self.extended(base)
name = base.class.name.gsub(/filter/i, '')
define_method(name.downcase.to_sym) { Kernel.const_get name }
end
end
def self.included base
base.extend ClassMethods
end
end
end
class ShowFilter
include Filters::Base
filter :name do |name|
self.show.where(:name => name)
end
end
编辑:使用示例
class ShowController < ApplicationController
def index
ShowFilter.run params[:query]
end
end