URI:Module 的未定义方法“escape”

问题描述 投票:0回答:4

我是一个研究 Ruby on Rails 的菜鸟。我正在尝试将 ruby on Rails 应用程序集成到 Quickbooks 中。我正在按照此视频的步骤进行操作。当我尝试按“连接到 QuickBooks”按钮进行身份验证时,我陷入了困境。

enter image description here

我收到此错误;

enter image description here

我做了一些研究,发现这个错误与

URI.escape()
命令有关。我认为他们在 Ruby 3 中删除了它。我该如何解决这个问题?我什至不知道这个
URI.escape()
命令位于哪里。

这是来自

vendors_controller.rb

def authenticate
    callback = oauth_callback_vendors_url
    token = $qb_oauth_consumer.get_request_token(:oauth_callback => callback)
    session[:qb_request_token] = token
    # If Rails >= 4.1 you need to do this => session[:qb_request_token] = Marshal.dump(token)   
    redirect_to("https://appcenter.intuit.com/Connect/Begin?oauth_token=#{token.token}") and return
  end

  def oauth_callback
    at = session[:qb_request_token].get_access_token(:oauth_verifier => params[:oauth_verifier])
    # If Rails >= 4.1 you need to do this =>  at = Marshal.load(session[:qb_request_token]).get_access_token(:oauth_verifier => params[:oauth_verifier])
    session[:token] = at.token
    session[:secret] = at.secret
    session[:realm_id] = params['realmId']
    redirect_to root_url, notice: "Your QuickBooks account has been successfully linked."
  end

我的初始化器

quickbooks.rb

QB_KEY = "I PASTED MY CLIENT ID KEY HERE"
QB_SECRET = "I PASTED MY CLIENT SECRET HERE"

$qb_oauth_consumer = OAuth::Consumer.new(QB_KEY, QB_SECRET, {
    :site                 => "https://oauth.intuit.com",
    :request_token_path   => "/oauth/v1/get_request_token",
    :authorize_url        => "https://appcenter.intuit.com/Connect/Begin",
    :access_token_path    => "/oauth/v1/get_access_token"
})

我的 Rails 版本

Rails 6.1.4
我的红宝石版本
ruby 3.0.1p64

感谢您的宝贵时间。

ruby-on-rails ruby quickbooks quickbooks-online intuit-partner-platform
4个回答
12
投票

我知道很多人说 URI.escape 不好,但它对我来说已经足够好了,因为我只想转义带有非英文字符的 url。

所以我只是猴子修补它

在 /config/initializers/functions_overrides.rb 下添加以下内容 (文件名可以是任何你想要的)

require 'uri'

module URI
    class << self
        def escape(str)
            alpha = "a-zA-Z"
            alnum = "#{alpha}\\d"
            unreserved = "\\-_.!~*'()#{alnum}"
            reserved = ";/?:@&=+$,\\[\\]"
            unsafe = Regexp.new("[^#{unreserved}#{reserved}]")
            str.gsub(unsafe) do
                us = $&
                tmp = ''
                us.each_byte do |uc|
                    tmp << sprintf('%%%02X', uc)
                end
                tmp
            end.force_encoding(Encoding::US_ASCII)
        end
    end
end

2
投票

使用 https://developer.intuit.com/app/developer/qbo/docs/develop/sdks-and-samples-collections/ruby

OAuth Ruby 客户端

Intuit 提供了一个 OAuth 2.0 客户端,该客户端提供了一组方法,可以更轻松地使用 Intuit 的 OAuth 和 OpenID 实现。

社区支持的 Ruby SDK

社区支持的 Ruby SDK 使您可以轻松地将 Web 应用程序与 QuickBooks Online API 集成。本指南假设您有一个想要与 QuickBooks Online 集成的现有 Web 应用程序。


1
投票

URI#escape
已被弃用,后来被删除 - https://github.com/ruby/uri/commit/61c6a47ebf1f2726b60a2bbd70964d64e14b1f98

来自提交:

# This method is obsolete and should not be used. Instead, use
# CGI.escape, URI.encode_www_form or URI.encode_www_form_component
# depending on your specific use case.

Ruby 3.0.0 及以上版本

URI#escape
不起作用。

使用弃用警告中提到的

CGI.escape
URI.encode_www_form


0
投票

我也不得不对它进行猴子修补,虽然不优雅,但用现代的 ruby 但还是旧的回形针图像处理器来支持遗留应用程序:

module URI
  def URI.escape(url)
    url
  end
end

在初始化器内部。

© www.soinside.com 2019 - 2024. All rights reserved.