URI 的未定义方法“编码​​”:使用 gem Rspotify 的模块

Hak*_*aba 7 ruby uri ruby-on-rails urlencode spotify

我正在使用gem rspotify来访问我的 Rails 应用程序中的 Spotify 的 api。Rails 版本是 6.0.4 但最重要的是 Ruby 版本是 3.0.0

当我尝试调用 api 方法时,我不断收到此错误“URI:Module 的未定义方法‘编码’”。我必须强调,当我降级到 Ruby 2.6.3 时,我没有收到此错误。Ruby 3.0.0 似乎不支持 URI 编码。我的用户控制器是下面的代码示例。我收到Spotify_user.country和其他 api 方法的错误。

class UsersController < ApplicationController
  skip_before_action :authenticate_user!, only: [ :spotify]

  def spotify
    spotify_user = RSpotify::User.new(request.env['omniauth.auth'])
    spotify_user.country
  end
end
Run Code Online (Sandbox Code Playgroud)

在config/application.rb中

RSpotify::authenticate(ENV['SPOTIFY_CLIENT_ID'], ENV['SPOTIFY_CLIENT_SECRET'])
Run Code Online (Sandbox Code Playgroud)

在 devise.rb 中,我有

require 'rspotify/oauth'

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :spotify, ENV['SPOTIFY_CLIENT_ID'], ENV['SPOTIFY_CLIENT_SECRET'], scope: 
  'user-read-email playlist-modify-public user-library-read user-library-modify'
end
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一个不涉及降级 ruby​​ 版本的错误解决方案

Dav*_*ave 14

我从 Ruby 2.4.5 升级到 Ruby 3.0.2,我的解决方案是替换

URI.encode
Run Code Online (Sandbox Code Playgroud)

CGI.escape
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,但它们不能完全互换 /sf/ask/197688851/ Between-uri-escape-and-cgi-escape (3认同)

Kon*_*kov 5

URI.encode是它的别名,URI.escape在相当长一段时间内被认为(并报告)已过时。

最好查看您所询问的错误的回溯,但我想它在这里失败了。

正如您在这里所看到的,RSpotify 并不一致,URI.encode在一个地方和Addressable::URI.encode另一个地方使用。这很可能是一个有意识的决定,但乍一看它看起来像是一个偶然的事情。

对于您的问题,有几种解决方案:

  1. Fork RSpotify,修复问题(例如,将所有出现的 URI.encode 替换为 Addressable::URI.encode)并创建一个到上游的 PR。如果急于升级,您可以同时使用固定前叉。

  2. 您可以对 URI 本身进行猴子修补,添加已删除的encode方法。根本不是一个好主意,但仍然是一个选择......

  3. 将 RSpotify 替换为其他客户端。最涉及的一个,所以放在这里只是为了完整性:)