ruby 未定义URI的方法“encode”:带有gem Rspotify的模块

57hvy0tb  于 2023-03-17  发布在  Ruby
关注(0)|答案(2)|浏览(230)

我使用gem rspotify在我的rails应用程序中访问spotify的API,rails版本是6.0.4,但最重要的是Ruby版本是3.0.0
当我尝试调用API方法时,我总是得到这个错误“undefined method 'encode' for 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

在配置/应用程序.rb中

RSpotify::authenticate(ENV['SPOTIFY_CLIENT_ID'], ENV['SPOTIFY_CLIENT_SECRET'])

在device.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

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

liwlm1x9

liwlm1x91#

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

URI.encode

CGI.escape
xqk2d5yq

xqk2d5yq2#

URI.encodeURI.escape的别名,而URI.escape在相当长的一段时间内被认为(并报告)过时了。
最好查看您所询问的错误的回溯,但我猜它在这里失败了。
正如你所看到的here,RSpotify是不一致的,在一个地方使用URI.encode,在另一个地方使用Addressable::URI.encode。机会是这是一个有意识的决定,但乍一看,它看起来只是一个偶然的事情。
您的问题有几种解决方案:
1.派生RSpotify,修复这个问题(例如,用Addressable::URI.encode替换所有出现的URI.encode),并创建一个PR到上游。如果你急着升级,你可以使用你的固定派生。
1.你可以用monkey-patch URI本身来添加一个被移除的encode方法。这不是一个好主意,但仍然是一个选择...
1.用其他客户端替换RSotify。最涉及的一个,所以放在这里只是为了完整:)

相关问题