クラスに含まれるモジュールを作成しました。モジュールで、Filter を使用しないクラス名の小文字バージョンであるメソッドを定義しようとしています。したがって、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
EDIT:使用例
class ShowController < ApplicationController
def index
ShowFilter.run params[:query]
end
end