Ruby,Sinatra,Overriding /从单独的文件扩展类以添加方法

时间:2014-02-25 09:50:10

标签: ruby sinatra rack

我是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(期望的类)(TypeError)'

我阅读了包括this在内的各种文章,但我并没有那么困惑,我认为问题源于我试图从这个外部文件扩展子类的事实,而不是它的根类。

这样做的正确方法是什么?

修改 - 有关我的要求的更多信息: 我将这个需求基于Sinatra文档中的这个样本。我希望@auth对象具有良好性,例如provided?basic?,但由于我不能像@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

1 个答案:

答案 0 :(得分:0)

我真的不明白你期望表达式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