这肯定让我困惑了几个小时。我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}}。
建议和协助表示赞赏!
答案 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定义,包括可用的方法,参数和数据类。