Google API Ruby客户端(gem)错误`未初始化的常量Google :: APIClient :: UploadIO`

时间:2012-05-24 11:11:00

标签: ruby-on-rails ruby oauth-2.0 google-drive-api

这肯定让我困惑了几个小时。我bootstrapped my application as detailed by Baugues表示通过OAuth2进行身份验证可以正常工作,我只是在session#create(回调)操作中测试一下。这是一些代码:

class SessionsController < ApplicationController
  def create
    @auth = request.env["omniauth.auth"]
    @token = @auth["credentials"]["token"]
    client = Google::APIClient.new
    client.authorization.access_token = @token
    service = client.discovered_api('drive', 'v1')

    file_content = Google::APIClient::UploadIO.new("foo", "text/plain")

    # @result = client.execute(
    #   :api_method => service.files.get,
    #   :parameters => { 'id' => 1 },
    #   :headers => {'Content-Type' => 'application/json'})
  end
end

在进行身份验证时,上述逻辑在callback方法中执行 - 出于此粗略测试的目的,该方法呈现create.html.erb。我已经注释掉了刚刚回显到视图中的@result实例变量。

然而,当Google::APIClient::UploadIO.new("foo", "text/plain")显然不应该uninitialized constant Google::APIClient::UploadIO时,UploadIO会触发required。我已经挖掘了这个宝石的来源,而media.rb类在宝石的{{1}}中是{{1}}。

建议和协助表示赞赏!

价:

3 个答案:

答案 0 :(得分:8)

检查您的Gemfile.lock以查看它实际使用的google-api-client版本。当我执行相同的步骤时,默认情况下它看起来像0.3.0,可能是由于google-omniauth-plugin稍微落后于它的依赖。 0.3.0没有媒体支持。

尝试将Gemfile更改为

gem 'google-api-client', '~> 0.4.3', :require => 'google/api_client'

并重新运行'bundle install'以强制它使用更新的版本。

答案 1 :(得分:2)

对于偶然发现google-api-client宝石版本大于或等于0.9的人,你会想要使用类似的东西:

gem 'google-api-client', :require => 'google/apis/analytics_v3'

将“analytics_v3”与您正在使用的生成的Google服务API进行交换。

有关生成的API名称的完整列表,请参阅:https://github.com/google/google-api-ruby-client/tree/master/generated/google/apis

答案 2 :(得分:2)

在这里,您可以看到如何从版本0.8。*迁移到0.9。*

在0.8.x中,库将“动态”发现API,引入额外的网络调用和不稳定性。这已经修正为0.9。

要在0.8.x中获取驱动器客户端,需要:

require 'google/api_client'

client = Google::APIClient.new
drive = client.discovered_api('drive', 'v2')

在0.9中,可以像这样完成同样的事情:

require 'google/apis/drive_v2'

drive = Google::Apis::DriveV2::DriveService.new

无需额外的网络调用或运行时代码生成即可立即访问所有API。

API方法

API方法的调用样式已更改。在0.8.x中,所有调用都是通过通用的执行方法。在0.9中,生成的服务具有针对所有可用方法的完全定义的方法签名。

要使用0.8.x中的Google Drive API获取文件,请执行以下操作:

file = client.execute(:api_method => drive.file.get, :parameters => { 'id' => 'abc123' })

在0.9中,可以像这样完成同样的事情:

file = drive.get_file('abc123')

可以在生成的目录中找到完整的API定义,包括可用的方法,参数和数据类。

LINK