我是一个研究 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
我的初始化器
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
感谢您的宝贵时间。
我知道很多人说 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
使用 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 应用程序。
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
我也不得不对它进行猴子修补,虽然不优雅,但用现代的 ruby 但还是旧的回形针图像处理器来支持遗留应用程序:
module URI
def URI.escape(url)
url
end
end
在初始化器内部。