【问题标题】:Undefined method `escape' for URI:ModuleURI:Module 的未定义方法“转义”
【发布时间】:2021-06-29 07:31:42
【问题描述】:

我是一个学习 Ruby on Rails 的菜鸟。我正在尝试将我的 ruby​​ on rails 应用程序集成到 Quickbooks。我正在按照this video 的步骤进行操作。当我尝试按“连接到 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

感谢您的宝贵时间。

【问题讨论】:

  • 该错误将来自您用于 OAuth 的 gem。快速浏览一下教程中的 gem,它使用的 oauth-plugin gem 最后一次发布是在 2013 年,所以后面还有很多 ruby​​ 版本。您可能会寻找更新的教程。 quickbooks-ruby gem (github.com/ruckus/quickbooks-ruby) gem 似乎得到了合理的维护,并且在其 GitHub 站点上有一些文档,您可以查看。
  • 未来的另一个提示:如果您在错误页面上单击“完整跟踪”(您制作了屏幕截图),您可以按照回溯跟踪,它还应该给您提示错误的位置来自。将完整的堆栈跟踪添加到关于 SO 的问题也有助于人们更快地了解如何为您提供帮助。
  • @rmlockerd 谢谢,我目前也在我的代码中使用quickbooks-ruby。我要求这里的人们提出更可靠的最新指南或方法,但我的问题被否决了,然后被删除。我正在网上寻找更好的教程,但除了这个 7 岁的视频指南之外,没有一个适合我的条件。
  • @trueunlessfalse 我做了并且得到了这条线; oauth (0.4.7) lib/oauth/helper.rb:12:in 'escape' 现在我知道这是因为位于'oauth-plugin' gem 中的助手。
  • 您也可以选择从 ruby​​ 2.7 开始,并在问题解决后升级到 ruby​​ 3。使用 rvm 或 rbenv 可能会有所帮助。

标签: ruby-on-rails ruby quickbooks quickbooks-online intuit-partner-platform


【解决方案1】:

使用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 使您可以轻松地将您的网络应用程序与 QuickBooks Online API 集成。本指南假定您有一个想要与 QuickBooks Online 集成的现有网络应用程序。

【讨论】:

    【解决方案2】:

    我知道很多人说 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
    

    【讨论】:

      猜你喜欢
      • 2023-01-20
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      • 2013-06-11
      • 2022-12-23
      • 2012-07-27
      • 1970-01-01
      • 2013-04-24
      相关资源
      最近更新 更多