gpt4 book ai didi

ruby-on-rails - 在动态方法中更改实例变量(使用 ActiveResource 的动态资源)

转载 作者:太空宇宙 更新时间:2023-11-03 16:30:36 28 4
gpt4 key购买 nike

我正在使用动态分派(dispatch)在一个继承自 ActiveResource 的类中定义多个类方法。

class Invoice < ActiveResource::Base
self.site = 'http://localhost:8080/'

def self.define(method)
define_singleton_method(method) do |params = {}|
site = self.site
self.site = "#{self.site}/Invoice/#{method.to_s.camelize(:lower)}"

puts "self.site -> #{self.site}"
results = Invoice.all(params: params)

self.site = site
puts "changing self.site back to #{site}"

return results
end
end

define :get_details
define :put_approval
define :get_attachment
define :get_pending_notifications
end

这对于第一次调用非常有用,无论它是什么(Invoice.get_details、Invoice.get_pending_notifications...),但在第二次调用时总是失败。

我想了解为什么会发生这种情况,以及我可以做些什么来修复它。

最佳答案

进一步研究后,我发现 self.site 在我要求时实际上并没有改变。它告诉我它在日志中发生了变化,但它在说谎! self.site 在调用的第一个方法中不会从其初始设置状态改变。我有一个关于为什么这不起作用的理论以及让它起作用的解决方法。

首先,我的理论:

当任何一个定义的类方法被调用时,site 被设置。由于 site 超出了被调用的类方法的范围,因此一旦最初设置,此后就无法更改。

一个例子:

Invoice.get_details

Invoice.site 初始设置为“localhost:8080/Invoice/getDetails”

Invoice.get_pending_notifications

Invoice.site 无法更改,因为它已定义为“localhost:8080/Invoice/getDetails”

以上只是一个工作理论。

我是如何做到这一点的:

删除所有对 self.site 的引用,除了初始设置 self.site = "localhost:8080" 并改为使用 url 字符串。 (在 http://ofps.oreilly.com/titles/9780596521424/activeresource_id59243.html 的“从自定义路径中查找资源”部分下)

class Invoice < ActiveResource::Base
self.site = "localhost:8080"
def self.define(method)
define_singleton_method(method) do |params = {}|
url = "#{self.site}/Invoice/#{method.to_s.camelize(:lower)}"

# results = Invoice.all(params: params) <- Change this call to below
results = Invoice.find(:all, from: url, params: params)

return results
end
end

define :get_details
define :put_approval
define :get_attachment
define :get_pending_notifications
end

使用上面的代码,我可以毫无问题地调用任何定义的方法,每个方法都指向不同的 url。

关于ruby-on-rails - 在动态方法中更改实例变量(使用 ActiveResource 的动态资源),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16678524/

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