gpt4 book ai didi

ruby - 在具有变量名称的模块中定义类方法

转载 作者:太空宇宙 更新时间:2023-11-03 18:25:35 32 4
gpt4 key购买 nike

我创建了一个包含在类中的模块。在模块中,我试图定义一个方法,它是一个没有过滤器的类名的小写版本。因此 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

最佳答案

当您定义 Filters::Base::ClassMethods 时,它会在该上下文中评估 self ,因此您最终定义的方法是 ClassMethods.classmethods(因为gsub 不会做任何事情)。

就像您在 Base 中使用的包含的钩子(Hook)一样,您想在 ClassMethods 中使用扩展:

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
Object.const_get(self.to_s.gsub('Filter', ''))
end

def self.extended(base)
define_method(base.to_s.downcase.gsub('filter', '').to_sym) do
Object.const_get(self.to_s.gsub('Filter', ''))
end
end
end

def self.included base
base.extend ClassMethods
end
end
end
class ShowFilter
include Filters::Base

filter :title do |title|
self.show.where(:title => title)
end
end

关于ruby - 在具有变量名称的模块中定义类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11640917/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com