使用 Spaceship::Tunes 时出现 rails 错误
Getting rails error when using Spaceship::Tunes
在 rails 应用程序中,我 运行ning:
54 def itunes_all_apps
55 begin
56 Spaceship::Tunes.login(params[:itunes_username], params[:itunes_password])
57 apps = Spaceship::Tunes::Application.all
58 render json: apps.to_json, status: 200
59 rescue => e
60 render json: {error: e}.to_json, status: 500
61 end
62 end
每次都是 returns 状态 500 错误,没有其他信息。
但是,如果我稍微改变一下,例如组建团队(注意,来自 Spaceship,而不是 Spaceship::Tunes),这很好用:
def itunes_all_apps
begin
spaceship = Spaceship.login(params[:itunes_username], params[:itunes_password])
teams = spaceship.teams
render json: teams.to_json, status: 200
rescue => e
render json: {error: e}.to_json, status: 500
end
end
我没有使用任何快速文件或配置或任何东西。只需通过 api 调用传递用户名和密码并尝试获得响应。我是 rails 的新手,所以这可能是我对提供的 Spaceship 示例的实现。
使用宇宙飞船0.36.1gem(最新)
我仔细阅读了文档,但无济于事。抓住任何关于我做错事的线索。
http://www.rubydoc.info/gems/spaceship/Spaceship/Tunes
https://github.com/fastlane/fastlane/blob/master/spaceship/docs/iTunesConnect.md
有人建议我 运行 在 irb 中使用这两个命令,我照做了,它们运行得非常好!
Spaceship::Tunes.login('myAppleId', 'myPassword')
Spaceship::Tunes::Application.all
所以这不是 iTunes 帐户问题或凭据问题(因为它在 irb 中工作)、路由问题(因为我 运行 以上 rails 方法使用相同的路由)或参数问题 (因为我 运行 以上两个 rails 方法都具有相同的参数名称)。
我非常感谢任何建议。谢谢。
编辑:
注释掉begin、rescue、rending错误,堆栈轨迹如下:
2016-10-24T17:47:34.974650+00:00 app[web.1]: Started POST "/api/v1/users/13/itunes_all_apps" for 162.237.102.13 at 2016-10-24 17:47:34 +0000
2016-10-24T17:47:34.977478+00:00 app[web.1]: Processing by Api::V1::UsersController#itunes_all_apps as JSON
2016-10-24T17:47:34.977521+00:00 app[web.1]: Parameters: {"itunes_username"=>"myCorrectUsername", "itunes_password"=>"[FILTERED]", "team_id"=>"myCorrectTeamId", "id"=>"13", "user"=>{}}
2016-10-24T17:47:35.629629+00:00 heroku[router]: at=info method=POST path="/api/v1/users/13/itunes_all_apps" host=myHerokuApp.herokuapp.com request_id=002d906d-354e-4633-8b54-71aa5181e3a7 fwd="161.237.102.13" dyno=web.1 connect=2ms service=657ms status=500 bytes=259
2016-10-24T17:47:35.619597+00:00 app[web.1]: Completed 500 Internal Server Error in 642ms (ActiveRecord: 0.0ms)
2016-10-24T17:47:35.620430+00:00 app[web.1]:
2016-10-24T17:47:35.620432+00:00 app[web.1]: IOError (not opened for reading):
2016-10-24T17:47:35.620434+00:00 app[web.1]:
2016-10-24T17:47:35.620433+00:00 app[web.1]: app/controllers/api/v1/users_controller.rb:58:in `itunes_all_apps'
似乎Spaceship::Fastlane::Application
没有实现as_json
方法,默认as_json
触及一些IO对象,不能表示为json。
我的建议是创建 JSON 序列化程序。您可以使用 active_model-serializer,但如果您不想只为一个对象创建依赖项,那么您可以创建自己的序列化程序。
class SpaceshipApplicationSerializer
attr_reader :spaceship_applications
def initialize(spaceship_applications)
@spaceship_applications = spaceship_applications
end
def as_json(options = {})
spaceship_applications.each_with_object([]) do |spaceship_application, memo|
memo << object_as_json(spaceship_application)
end
end
def object_as_json(object)
attributes.each_with_object({}) do |attribute, memo|
memo[attribute] = object.send(attribute)
end
end
def attributes
[
:apple_id,
:name,
:vendor_id,
:bundle_id,
:last_modified,
:issues_count,
:app_icon_preview_url
]
end
end
# 在你的控制器中
def itunes_all_apps
begin
Spaceship::Tunes.login(params[:itunes_username], params[:itunes_password])
apps = Spaceship::Tunes::Application.all
render json: SpaceshipApplicationSerializer.new(apps).to_json, status: 200
rescue => e
render json: {error: e}.to_json, status: 500
end
end
编辑:
是的,classes return 是一个数组,但数组中的实际对象不能很好地与 json 配合使用。很难说问题是否出在库上——一方面 Spaceship::Tunes::Application
没有 return 正确的 json 表示是一个缺失的特性,但是如果 to_json
提出了一个异常(class 响应的方法)——那么我会说这是一个错误。
创建您自己的序列化程序以按照您想要的方式构建 json 表示 - 是一种常见模式。
在 rails 应用程序中,我 运行ning:
54 def itunes_all_apps
55 begin
56 Spaceship::Tunes.login(params[:itunes_username], params[:itunes_password])
57 apps = Spaceship::Tunes::Application.all
58 render json: apps.to_json, status: 200
59 rescue => e
60 render json: {error: e}.to_json, status: 500
61 end
62 end
每次都是 returns 状态 500 错误,没有其他信息。
但是,如果我稍微改变一下,例如组建团队(注意,来自 Spaceship,而不是 Spaceship::Tunes),这很好用:
def itunes_all_apps
begin
spaceship = Spaceship.login(params[:itunes_username], params[:itunes_password])
teams = spaceship.teams
render json: teams.to_json, status: 200
rescue => e
render json: {error: e}.to_json, status: 500
end
end
我没有使用任何快速文件或配置或任何东西。只需通过 api 调用传递用户名和密码并尝试获得响应。我是 rails 的新手,所以这可能是我对提供的 Spaceship 示例的实现。
使用宇宙飞船0.36.1gem(最新)
我仔细阅读了文档,但无济于事。抓住任何关于我做错事的线索。
http://www.rubydoc.info/gems/spaceship/Spaceship/Tunes
https://github.com/fastlane/fastlane/blob/master/spaceship/docs/iTunesConnect.md
有人建议我 运行 在 irb 中使用这两个命令,我照做了,它们运行得非常好!
Spaceship::Tunes.login('myAppleId', 'myPassword')
Spaceship::Tunes::Application.all
所以这不是 iTunes 帐户问题或凭据问题(因为它在 irb 中工作)、路由问题(因为我 运行 以上 rails 方法使用相同的路由)或参数问题 (因为我 运行 以上两个 rails 方法都具有相同的参数名称)。
我非常感谢任何建议。谢谢。
编辑:
注释掉begin、rescue、rending错误,堆栈轨迹如下:
2016-10-24T17:47:34.974650+00:00 app[web.1]: Started POST "/api/v1/users/13/itunes_all_apps" for 162.237.102.13 at 2016-10-24 17:47:34 +0000
2016-10-24T17:47:34.977478+00:00 app[web.1]: Processing by Api::V1::UsersController#itunes_all_apps as JSON
2016-10-24T17:47:34.977521+00:00 app[web.1]: Parameters: {"itunes_username"=>"myCorrectUsername", "itunes_password"=>"[FILTERED]", "team_id"=>"myCorrectTeamId", "id"=>"13", "user"=>{}}
2016-10-24T17:47:35.629629+00:00 heroku[router]: at=info method=POST path="/api/v1/users/13/itunes_all_apps" host=myHerokuApp.herokuapp.com request_id=002d906d-354e-4633-8b54-71aa5181e3a7 fwd="161.237.102.13" dyno=web.1 connect=2ms service=657ms status=500 bytes=259
2016-10-24T17:47:35.619597+00:00 app[web.1]: Completed 500 Internal Server Error in 642ms (ActiveRecord: 0.0ms)
2016-10-24T17:47:35.620430+00:00 app[web.1]:
2016-10-24T17:47:35.620432+00:00 app[web.1]: IOError (not opened for reading):
2016-10-24T17:47:35.620434+00:00 app[web.1]:
2016-10-24T17:47:35.620433+00:00 app[web.1]: app/controllers/api/v1/users_controller.rb:58:in `itunes_all_apps'
似乎Spaceship::Fastlane::Application
没有实现as_json
方法,默认as_json
触及一些IO对象,不能表示为json。
我的建议是创建 JSON 序列化程序。您可以使用 active_model-serializer,但如果您不想只为一个对象创建依赖项,那么您可以创建自己的序列化程序。
class SpaceshipApplicationSerializer
attr_reader :spaceship_applications
def initialize(spaceship_applications)
@spaceship_applications = spaceship_applications
end
def as_json(options = {})
spaceship_applications.each_with_object([]) do |spaceship_application, memo|
memo << object_as_json(spaceship_application)
end
end
def object_as_json(object)
attributes.each_with_object({}) do |attribute, memo|
memo[attribute] = object.send(attribute)
end
end
def attributes
[
:apple_id,
:name,
:vendor_id,
:bundle_id,
:last_modified,
:issues_count,
:app_icon_preview_url
]
end
end
# 在你的控制器中
def itunes_all_apps
begin
Spaceship::Tunes.login(params[:itunes_username], params[:itunes_password])
apps = Spaceship::Tunes::Application.all
render json: SpaceshipApplicationSerializer.new(apps).to_json, status: 200
rescue => e
render json: {error: e}.to_json, status: 500
end
end
编辑:
是的,classes return 是一个数组,但数组中的实际对象不能很好地与 json 配合使用。很难说问题是否出在库上——一方面 Spaceship::Tunes::Application
没有 return 正确的 json 表示是一个缺失的特性,但是如果 to_json
提出了一个异常(class 响应的方法)——那么我会说这是一个错误。
创建您自己的序列化程序以按照您想要的方式构建 json 表示 - 是一种常见模式。