Я создал модуль, который включен в класс. В модуле я пытаюсь определить метод, который представляет собой сокращенную версию имени класса без фильтра. Таким образом, ShowFilter будет иметь метод show, который возвращает класс Show. Я получаю "NoMethodError: неопределенный метод `show' для ShowFilter:Class"
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
show
? - person Sergio Tulentsev   schedule 25.07.2012