Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.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 使用RubyonRails解析Json数据_Ruby On Rails_Ruby_Json_Parsing_Nomethoderror - Fatal编程技术网

Ruby on rails 使用RubyonRails解析Json数据

Ruby on rails 使用RubyonRails解析Json数据,ruby-on-rails,ruby,json,parsing,nomethoderror,Ruby On Rails,Ruby,Json,Parsing,Nomethoderror,目标:解析数据以显示erb文件中的所有id 问题:由于这段代码,DemoController#索引中的nomethoder错误 @x=obj[i][“id”] 当我用一个数字替换上面代码中的“I”时,会显示一个id号,这使我相信while循环是正确的。它只是不明白“我”是什么 我做错了什么 这是我的控制器和视图代码 demo_controller.rb require 'rubygems' require 'json' require 'net/http' require 'httparty'

目标:解析数据以显示erb文件中的所有id

问题:
由于这段代码,DemoController#索引中的nomethoder错误
@x=obj[i][“id”]

当我用一个数字替换上面代码中的“I”时,会显示一个id号,这使我相信while循环是正确的。它只是不明白“我”是什么

我做错了什么

这是我的控制器和视图代码

demo_controller.rb

require 'rubygems'
require 'json'
require 'net/http'
require 'httparty'
class DemoController < ApplicationController

  respond_to :json
  $angelURI = "https://api.angel.co/1/jobs"

  def index
    response = HTTParty.get('https://api.angel.co/1/jobs/')
    obj = JSON.parse(response.body)["jobs"]
    arraylength = obj.length

    i = 0
    while i <= arraylength do
      @x = obj[i]["id"]
      i += 1

    end


  end
end
需要“rubygems”
需要“json”
需要“net/http”
需要“httparty”
类DemoController<应用程序控制器
回复:json
$angelURI=”https://api.angel.co/1/jobs"
def索引
response=HTTParty.get('https://api.angel.co/1/jobs/')
obj=JSON.parse(response.body)[“作业”]
阵列长度=目标长度
i=0

虽然i
i
while
循环中的一个计数器,但它是最基本的。我想你循环到更多,改变
I
中的一个计数器,而
循环是基础。我想你会循环到更多,改变

  • 您在循环的每个级别为同一@x变量赋值-这将以@x具有最后一个id的值结束-这是预期的行为吗

  • 我现在看不出你的数组有什么奇怪的地方,但Ruby倾向于将每一个都用于:

    obj.each do |elem|
      @x = elem["id"]
    end
    
  • Upate:遵循zishe对循环的好理解,使用每个元素也可以避免类似的问题(“我需要转到第I个元素还是在第I个元素停止”)

  • 您在循环的每个级别为同一@x变量赋值-这将以@x具有最后一个id的值结束-这是预期的行为吗

  • 我现在看不出你的数组有什么奇怪的地方,但Ruby倾向于将每一个都用于:

    obj.each do |elem|
      @x = elem["id"]
    end
    

  • Upate:遵循zishe关于循环的好方法,使用每种方法也可以避免此类问题(“我需要去第I个元素还是在第I个元素停止”)。

    结合我们得到的最佳答案:

    @x = []
    obj.each do |job|
      @x << job["id"]
    end
    
    @x=[]
    每个人都有自己的工作|
    
    @x结合最佳答案,我们得到:

    @x = []
    obj.each do |job|
      @x << job["id"]
    end
    
    @x=[]
    每个人都有自己的工作|
    
    @x您的代码中有一个由一个关闭的错误。基本上,您在数组上循环,然后尝试访问比数组中多的一个元素,然后返回为
    nil
    ,自然不会作为散列

    假设您的
    obj
    是一个包含3个元素的数组,因此
    arraylength
    是三个元素。现在,您正在从数组中获取4个元素,这些元素的索引为
    0
    1
    2
    3
    。由于只有3个元素
    0..2
    ,最后一个
    obj[3]
    不存在

    要保留现有代码,可以将循环更改为以下内容:

    while i < arraylength do
      #...
    end
    

    您的代码中有一个off-by-one错误。基本上,您在数组上循环,然后尝试访问比数组中多的一个元素,然后返回为
    nil
    ,自然不会作为散列

    假设您的
    obj
    是一个包含3个元素的数组,因此
    arraylength
    是三个元素。现在,您正在从数组中获取4个元素,这些元素的索引为
    0
    1
    2
    3
    。由于只有3个元素
    0..2
    ,最后一个
    obj[3]
    不存在

    要保留现有代码,可以将循环更改为以下内容:

    while i < arraylength do
      #...
    end
    

    因此,您有一个off-by-one错误:您的while循环运行得太远(因为
    所以,您有一个off-by-one错误:您的while循环运行得太远)(因为
    这正是我想要的。非常感谢!这正是我想要的。非常感谢!哇!这对制作帮助文件非常有帮助。我一定要尝试一下。非常感谢它的清晰性!哇!这对制作帮助文件非常有帮助。我一定要尝试一下。非常感谢清晰!我忽略了“我忽略了”不知道“。最后一个“谢谢你的提示!不知道”。最后一个“谢谢你的提示!谢谢你的”。每个“提示!谢谢你的”。每个“提示!
    
    require 'httparty'
    
    module JobsParser
    
      ANGEL_JOBS_URI = "https://api.angel.co/1/jobs"
    
      def all_job_ids
        all_jobs.map{|j| j["id"]} 
      end
    
      def all_jobs
        response = HTTParty.get(ANGEL_JOBS_URI)
        jobs = JSON.parse(response.body)["jobs"]
      end
    end
    
    class DemoController < ApplicationController
    
      def index
        all_job_ids = JobsParser.all_job_ids
        @x = all_job_ids.last
      end
    
    end