gpt4 book ai didi

ruby-on-rails - Ruby (rails) - 在模型中包含模块

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

我错过了一些愚蠢的东西。帮忙?

库/api.rb

require 'httparty'

module API
def self.call_api(query)
base_url = "http://myapi.com"
return HTTParty.get("#{base_url}/#{query}.json")
end
end

模型/job.rb

require 'api'

class Job
include API

def self.all(page=1)
self.call_api "jobs?page=#{page}"
end

end

Job::all NoMethodError: undefined method `call_api' for Job:Class

如果我将我的“call_api”直接移动到 Job 类中,它就可以工作。我错过了什么?

最佳答案

其他答案指出了您应该扩展而不是包含的问题:

class Job
extend API

您可能还想考虑使用以下模式,它除了有用之外还有助于减轻混淆,因为您可以直接告诉您您的类方法在 ClassMethods 模块中,而您的实例方法直接在 MyModule 模块中。

module MyModule

def self.included(base)
base.extend(ClassMethods)
end

module ClassMethods
def my_class_method
end
end

def my_instance_method
end
end

这使用了 Ruby 的 included 回调(每当一个模块被包含在一个类中时就会触发),我们重新定义回调(通常什么都不做),以扩展其中的类该模块包含在 ClassMethods 子模块中。这是 Ruby 中非常常见的元编程模式。如果您使用此模式,则无需再担心扩展,只需使用 include:

class MyClass
include MyModule

然后:

MyClass.my_class_method
MyClass.new.my_instance_method

您还可以进一步使用此模式:

module MyModule
include ClassMethods

def self.included(base)
base.extend(ClassMethods)
end

module ClassMethods
def my_class_method
end
end

def my_instance_method
end
end

请注意,父模块直接包含其子 ClassMethods 模块。这样 my_class_method 就变成了实例和类方法:

class MyClass
include MyModule

MyClass.my_class_method
MyClass.new.my_class_method

如果你这样做,你必须要小心你如何在 ClassMethods 子模块中编写你的方法。但我发现这种模式有时非常方便。

关于ruby-on-rails - Ruby (rails) - 在模型中包含模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6989220/

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