Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用Spaceship::Tunes时获取rails错误_Ruby On Rails_Ruby_Fastlane - Fatal编程技术网

Ruby on rails 使用Spaceship::Tunes时获取rails错误

Ruby on rails 使用Spaceship::Tunes时获取rails错误,ruby-on-rails,ruby,fastlane,Ruby On Rails,Ruby,Fastlane,在我正在运行的rails应用程序中: 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

在我正在运行的rails应用程序中:

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
它每次都返回一个状态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新手,所以这可能是我所提供的飞船示例的实现

使用宇宙飞船0.36.1 gem(最新版本)

我把文件都翻了一遍也没用。抓住任何关于我做错了什么的线索

有人建议我在irb中运行这两个命令,我做到了,它们工作得非常好

Spaceship::Tunes.login('myAppleId', 'myPassword')
Spaceship::Tunes::Application.all
因此,这不是iTunes帐户问题或凭据问题(因为它在irb中工作)、路由问题(因为我使用相同的路由运行了上面的两个rails方法)或params问题(因为我使用相同的param名称运行了上面的两个rails方法)

我非常感谢你的建议。谢谢

编辑:

注释出“开始”、“救援”和“渲染”错误,堆栈跟踪如下所示:

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序列化程序。可以使用,但如果不想只为一个对象创建依赖项,则可以创建自己的序列化程序

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
编辑:

是的,这些类返回一个数组,但是数组中的实际对象不能很好地使用json。很难说问题是否出在库上——一方面,
Spaceship::Tunes::Application
没有返回正确的json表示是缺少的特性,但是如果
to_json
引发异常(类响应的方法),那么我会说这是一个bug


创建自己的序列化程序以按照您想要的方式构建json表示是一种常见模式。

似乎
呈现json:{error:e,status:500}.to_json
应该像
呈现json:{error:e}.to_json,status:500
那样编写,尽管我不确定是否需要
to_json
调用。Rails可能会自动推断。@Magnuss谢谢,我已经更新了我的
render
方法,尽管它没有影响。当你说“它返回一个状态500…”时,这意味着发生了异常,这是什么类型的错误?你能在
rescue=>e
之后立即放置e.to_并阅读服务器日志吗?@Magnuss谢谢,我不知道如何解决这个问题。我现在这样做了,在日志中说,
没有打开阅读
。另一件事-Spaceship::Tunes::Application.all.to_json在irb中也能工作吗?我会试试你的序列化程序。另外,您是如何得出结论,它没有像_json那样实现
?就我自己将来所知,因为从文档中我可以看出,所有应用程序都返回一个数组,所有团队都返回一个数组,那么为什么两者都不实现json呢?还是图书馆出了问题?非常感谢您的时间。更新了我的答案
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