Ruby,Sinatra,重写/从一个单独的文件扩展一个类以添加一个方法



我是Ruby的新手,我可以找到这个问题的各种变体的答案,但不能找到问题本身的答案。

我正在编写一个应用程序,该应用程序获取基本的身份验证详细信息,并使用它们向第三方平台验证用户。因此,我需要能够访问密码以便将其传递给,但我还希望能够使用机架身份验证类

我想做的就是:

require 'rack/auth/abstract/request'
require 'rack/auth/basic'
class AuthRequest < Rack::Auth::Basic::Request < Rack::Auth::AbstractRequest
def password
credentials[1]
end
end

如果我使用Request < Auth::AbstractRequest,IDE告诉我有未声明的常量,但如果我如上所述完全限定它,它会说"错误的参数类型true(预期的Class)(TypeError)">

我读了很多文章,包括这篇文章,但我也同样感到困惑,我认为问题源于我试图从这个外部文件扩展一个子类,而不是它的根类。

做这件事的正确方法是什么?

编辑-有关我的要求的更多信息:我的需求是基于Sinatra文档中的这个样本。我想要像provided?basic?那样精确的@auth对象,但由于我不能像@auth.credentials == ['admin', 'admin']那样简单地进行比较,我需要访问密码,这在默认实现中是不允许的

helpers do 
...
def authorized?
@auth ||=  Rack::Auth::Basic::Request.new(request.env)
@auth.provided? && @auth.basic? && @auth.credentials && @auth.credentials == ['admin', 'admin']
end
end

我真的不明白你期望表达式class AuthRequest < Rack::Auth::Basic::Request < Rack::Auth::AbstractRequest的行为,也许是某种多重继承?

这里的问题是,由于Rack::Auth::Basic::RequestRack::Auth::AbstractRequest的子类,表达式Rack::Auth::Basic::Request < Rack::Auth::AbstractRequest的计算结果为true(参见Module#<),因此您的表达式实际上被解释为class AuthRequest < true,这毫无意义,因此TypeError

如果我做对了你正在尝试实现的以下代码应该做的事情:

class AuthRequest < Rack::Auth::Basic::Request
def password
credentials[1]
end
end

最新更新