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

Kvo*_*e28 5 ruby quickbooks ruby-on-rails quickbooks-online intuit-partner-platform

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

在此输入图像描述

我收到这个错误;

在此输入图像描述

我做了一些研究,发现这个错误与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
Run Code Online (Sandbox Code Playgroud)

我的初始化程序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"
})

Run Code Online (Sandbox Code Playgroud)

我的 Rails 版本Rails 6.1.4 我的 ruby​​ 版本ruby 3.0.1p64

感谢您的时间。

obe*_*nda 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
Run Code Online (Sandbox Code Playgroud)


Ste*_*ell 2

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

\n

OAuth Ruby 客户端

\n

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

\n

社区支持的 Ruby SDK

\n

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

\n