【发布时间】:2023-03-09 12:50:02
【问题描述】:
我很难过我已经尝试了我能想到的一切来解决这个问题,但我一无所获。
Sinatra 的请求对象何时开始存在,它实际存在于何处,我如何从任何地方获取它?例如,另一个类继承自一个继承自 Sinatra::Base 的类的类。
我已经设法从this question 了解它的存在位置,但我似乎无法进一步了解。 我尝试过的事情:
def self.request
self.superclass.superclass.superclass.request
end
使用`instance_eval 或使用改变代码执行上下文的各种方法:
def self.method_added method_name
a = self.new.method(method_name)
def self.define_method method_name do
a.call
end
end
还有我能想到的任何其他东西,但无论我做什么request 总是为零,所以我再次问,请求对象在请求期间何时何地出现?
编辑:
没有冒犯,但我的问题很难说清楚?
这是问题,在标题中:
When and where does Sinatra's request object exist?
Sinatra 有一个请求对象,该对象什么时候开始存在? (比如在代码执行过程中什么时候不为零?)
当它确实存在时,它存在于哪里,在Sinatra::Base 的一个Sinatra::Base 的实例中还是在`Wrapper 或其他什么地方?
编辑:
这就是我正在做的事情:
在这个例子中:
r[:action] 是“获取”
r[:url] 是'/'
method 是get_root
instance 是一个存储self.new 的变量,因此我可以访问任何实例方法。
def method_added method
return if Delegation::SIN_DSL[:basic].include?(method)
r,p = get_r_data method
m = self.instance.method(method)
self.send r[:action], r[:url].first, (@options || {}) do
(m.arity < 1 ) ? m.call : m.call(*p)
end
@options = nil
end
【问题讨论】:
-
我编辑了问题以显示我所做的一些事情。
-
您可以通过
requestmethod 来获得它。至于它是从哪里来的,看源码就知道是attribute ofSinatra::Base,也就是请求到达app的时候是initialised incall!。 -
我试过了,但我得到了
undefined method 'request' for Sinatra::Base:Class:。当我做同样的事情而不是要求我做instance_variables.inspect时,我得到[:@conditions, :@routes, :@filters, :@errors, :@middleware, :@prototype, :@extensions, :@templates]。我通过存储对Sinatra::Base的引用来访问它,然后访问它。 -
你到底想在这里做什么?在您的请求处理代码(路由、助手等)中,您只需调用
request。在请求处理代码之外没有请求获取。 -
检查我的问题,我添加了它,请求方法也是一个实例方法,所以它不会是
Sinatra::Base的属性,而是Sinatra::Base实例的属性,有一个区别。我认为真正的问题是这个实例存储在哪里?如果我发现我可以访问它的方法和请求对象。从存储在Sinatra::Wrapper中的代码来看,它存储在哪里?`