首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Google客户端(gem)错误`未初始化常数Google::APIClient::UploadIO`‘

Google客户端(gem)错误`未初始化常数Google::APIClient::UploadIO`‘
EN

Stack Overflow用户
提问于 2012-05-24 11:10:59
回答 3查看 7.5K关注 0票数 4

这确实使我困惑了几个小时。我已经引导我的应用程序,如Baugues所详述的到了通过OAuth2进行身份验证的程度,我只是在session#create (回调)操作中测试。下面是一些代码:

代码语言:javascript
复制
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时,它会触发它。我已经深入研究了这个gem的来源,UploadIO类是gem的media.rb中的required

感谢您的建议和帮助!

参考:

EN

回答 3

Stack Overflow用户

发布于 2012-05-30 01:29:01

检查您的Gemfile.lock,看看它实际使用的google的哪个版本。当我完成同样的步骤时,它似乎默认为0.3.0,这很可能是因为谷歌的无所不在的插件有点落后于它的依赖性。0.3.0中没有媒体支持。

尝试将Gemfile更改为

代码语言:javascript
复制
gem 'google-api-client', '~> 0.4.3', :require => 'google/api_client'

并重新运行“包安装”,以迫使它使用更新的版本。

票数 8
EN

Stack Overflow用户

发布于 2016-03-10 22:10:29

对于偶然发现其google-api-client gem版本大于或等于0.9的人,您可能希望使用以下内容:

代码语言:javascript
复制
gem 'google-api-client', :require => 'google/apis/analytics_v3'

与您正在使用的生成的google交换"analytics_v3“。

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

票数 3
EN

Stack Overflow用户

发布于 2017-02-18 16:18:52

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

在0.8.x中,库会动态地“发现”API,从而引入额外的网络调用和不稳定性。这一数字已在0.9中得到修正。

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

代码语言:javascript
复制
require 'google/api_client'

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

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

代码语言:javascript
复制
require 'google/apis/drive_v2'

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

所有API都可以立即访问,而不需要额外的网络调用或运行时代码生成。

API方法

API方法的调用样式已经更改。在0.8.x中,所有调用都是通过泛型execute方法进行的。在0.9中,生成的服务完全定义了所有可用方法的方法签名。

要使用0.8.x中的获得一个文件,需要这样做:

代码语言:javascript
复制
file = client.execute(:api_method => drive.file.get, :parameters => { 'id' => 'abc123' })

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

代码语言:javascript
复制
file = drive.get_file('abc123')

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

链接

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10736348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档