Ruby on rails LinkedIn API JSON-我做错了什么?

Ruby on rails LinkedIn API JSON-我做错了什么?,ruby-on-rails,ruby,json,api,http,Ruby On Rails,Ruby,Json,Api,Http,我只想把LinkedIn的标题和群帖Id存储到我的文章模型中。这应该发生在: irb> Article.update_from_linkedin_group 我花了很多时间,尝试了很多变化。有人能指出我遗漏了什么吗 article.rb(模型): class Article < ActiveRecord::Base def self.update_from_linkedin_group require 'linkedin' client = Linkedin.

我只想把LinkedIn的标题和群帖Id存储到我的文章模型中。这应该发生在:

irb> Article.update_from_linkedin_group
我花了很多时间,尝试了很多变化。有人能指出我遗漏了什么吗

article.rb(模型):

class Article < ActiveRecord::Base

  def self.update_from_linkedin_group
    require 'linkedin'
    client = Linkedin.new({
      :consumer_key => "zzzzzz",     # LinkedIn API key.
      :consumer_secret => "zzzzzzz",  # LinkedIn API secret.
      :access_token => "zzzzzzz",     # Authenticated user access token.
      :access_secret => "zzzzzz"     # Authenticated user access secret.
    })
    json = client.group
    puts json.inspect
    add_entries(json)
  end
  private

  def self.add_entries(values)
    values.each do |value|
      unless exists? guid: value.id
        create!(
          title: value.title,
          guid: value.id
        )
      end
    end
  end
end
class Linkedin
  require 'oauth'
  require 'active_support'
  require 'json'
  def initialize(config)
    consumer = OAuth::Consumer.new(config[:consumer_key], config[:consumer_secret], {
      :site => 'https://api.linkedin.com',
      :authorize_path => '/uas/oauth/authorize',
      :request_token_path => '/uas/oauth/requestToken',
      :access_token_path => '/uas/oauth/accessToken'
        })
    @client = OAuth::AccessToken.new(consumer, config[:access_token], config[:access_secret])
  end

  def group
    request(:get, '/groups/4896676/posts?order=recency&category=discussion&format=json')
  end

  private
    def request(method, path)
      JSON.parse(@client.request(method, 'https://api.linkedin.com/v1' + path).body)
    end
end
1.9.3p374 :001 > Article.update_from_linkedin_group
{"_count"=>10, "_start"=>0, "_total"=>95, "values"=>[{"creator"=>{"firstName"=>"Brian", "headline"=>"Reach AngularJS Developers Via @AngularJobs", "id"=>"Cg70QGPa6j", "lastName"=>"Petro", "pictureUrl"=>"http://m3.licdn.com/mpr/mprx/0_CV5yQJidyeFzm-JZC0zfQsGEpa3v2qZZhZliQU1Miez51K74apvKHRbB-iTE71MN_JbCWpSkwG2e"}, "id"=>"g-4896676-S-240161182", "title"=>"A Reusable Bootstrap Modal AngularJS Directive for Forms", "type"=>{"code"=>"standard"}}, {"creator"=>{"firstName"=>"Brian", "headline"=>"Reach AngularJS Developers Via @AngularJobs", "id"=>"Cg70QGPa6j", "lastName"=>"Petro", "pictureUrl"=>"http://m3.licdn.com/mpr/mprx/0_CV5yQJidyeFzm-JZC0zfQsGEpa3v2qZZhZliQU1Miez51K74apvKHRbB-iTE71MN_JbCWpSkwG2e"}, "id"=>"g-4896676-S-240017185", "title"=>"Testing AngularJS", "type"=>{"code"=>"standard"}}, {"creator"=>{"firstName"=>"Brian", "headline"=>"Reach AngularJS Developers Via @AngularJobs", "id"=>"Cg70QGPa6j", "lastName"=>"Petro", "pictureUrl"=>"http://m3.licdn.com/mpr/mprx/0_CV5yQJidyeFzm-JZC0zfQsGEpa3v2qZZhZliQU1Miez51K74apvKHRbB-iTE71MN_JbCWpSkwG2e"}, "id"=>"g-4896676-S-240016428", "title"=>"AngularJS: Managing Feeds", "type"=>{"code"=>"standard"}}, {"creator"=>{"firstName"=>"Brian", "headline"=>"Reach AngularJS Developers Via @AngularJobs", "id"=>"Cg70QGPa6j", "lastName"=>"Petro", "pictureUrl"=>"http://m3.licdn.com/mpr/mprx/0_CV5yQJidyeFzm-JZC0zfQsGEpa3v2qZZhZliQU1Miez51K74apvKHRbB-iTE71MN_JbCWpSkwG2e"}, "id"=>"g-4896676-S-240016505", "title"=>"HashKeyCopier - An AngularJS Utility Class For Merging Cached And...", "type"=>{"code"=>"standard"}}, {"creator"=>{"firstName"=>"Brian", "headline"=>"Reach AngularJS Developers Via @AngularJobs", "id"=>"Cg70QGPa6j", "lastName"=>"Petro", "pictureUrl"=>"http://m3.licdn.com/mpr/mprx/0_CV5yQJidyeFzm-JZC0zfQsGEpa3v2qZZhZliQU1Miez51K74apvKHRbB-iTE71MN_JbCWpSkwG2e"}, "id"=>"g-4896676-S-240016218", "title"=>"« Building Huuuuuge Apps with AngularJS", "type"=>{"code"=>"standard"}}, {"creator"=>{"firstName"=>"Brian", "headline"=>"Reach AngularJS Developers Via @AngularJobs", "id"=>"Cg70QGPa6j", "lastName"=>"Petro", "pictureUrl"=>"http://m3.licdn.com/mpr/mprx/0_CV5yQJidyeFzm-JZC0zfQsGEpa3v2qZZhZliQU1Miez51K74apvKHRbB-iTE71MN_JbCWpSkwG2e"}, "id"=>"g-4896676-S-240015464", "title"=>"Building a Spreadsheet in 20 Minutes with Angular.js", "type"=>{"code"=>"standard"}}, {"creator"=>{"firstName"=>"Brian", "headline"=>"Reach AngularJS Developers Via @AngularJobs", "id"=>"Cg70QGPa6j", "lastName"=>"Petro", "pictureUrl"=>"http://m3.licdn.com/mpr/mprx/0_CV5yQJidyeFzm-JZC0zfQsGEpa3v2qZZhZliQU1Miez51K74apvKHRbB-iTE71MN_JbCWpSkwG2e"}, "id"=>"g-4896676-S-239786186", "title"=>"5 reasons to use AngularJS in the corporate app world", "type"=>{"code"=>"standard"}}, {"creator"=>{"firstName"=>"Brian", "headline"=>"Reach AngularJS Developers Via @AngularJobs", "id"=>"Cg70QGPa6j", "lastName"=>"Petro", "pictureUrl"=>"http://m3.licdn.com/mpr/mprx/0_CV5yQJidyeFzm-JZC0zfQsGEpa3v2qZZhZliQU1Miez51K74apvKHRbB-iTE71MN_JbCWpSkwG2e"}, "id"=>"g-4896676-S-239786152", "title"=>"dangle.js", "type"=>{"code"=>"standard"}}, {"creator"=>{"firstName"=>"Brian", "headline"=>"Reach AngularJS Developers Via @AngularJobs", "id"=>"Cg70QGPa6j", "lastName"=>"Petro", "pictureUrl"=>"http://m3.licdn.com/mpr/mprx/0_CV5yQJidyeFzm-JZC0zfQsGEpa3v2qZZhZliQU1Miez51K74apvKHRbB-iTE71MN_JbCWpSkwG2e"}, "id"=>"g-4896676-S-239785986", "title"=>"nodejs-mongo-angular-crud", "type"=>{"code"=>"standard"}}, {"creator"=>{"firstName"=>"Milan", "headline"=>"Yii/API Ninja at Divide Nine / Divide Nine Studios", "id"=>"5AGK3AkNFA", "lastName"=>"Z.", "pictureUrl"=>"http://m3.licdn.com/mpr/mprx/0_EBP1XaLgxDUIlA4nH9z2Xub-gdO6PtHne1buXuv_C7o9u9096l_0E23SPXYJrvdswNlDIIIGuxTj"}, "id"=>"g-4896676-S-239768061", "title"=>"2. Incorporate It", "type"=>{"code"=>"standard"}}]}
NoMethodError: undefined method `id' for ["_count", 10]:Array
from /home/brian/apps/angularjobs/app/models/article.rb:19:in `block in add_entries'
from /home/brian/apps/angularjobs/app/models/article.rb:18:in `each'
from /home/brian/apps/angularjobs/app/models/article.rb:18:in `add_entries'
from /home/brian/apps/angularjobs/app/models/article.rb:13:in `update_from_linkedin_group'
from (irb):1
from /home/brian/.rvm/gems/ruby-1.9.3-p374/bundler/gems/rails-1e5ee397ff37/railties/lib/rails/commands/console.rb:90:in `start'
from /home/brian/.rvm/gems/ruby-1.9.3-p374/bundler/gems/rails-1e5ee397ff37/railties/lib/rails/commands/console.rb:9:in `start'
from /home/brian/.rvm/gems/ruby-1.9.3-p374/bundler/gems/rails-1e5ee397ff37/railties/lib/rails/commands.rb:66:in `<top (required)>'
from bin/rails:4:in `require'
from bin/rails:4:in `<main>'
响应:

class Article < ActiveRecord::Base

  def self.update_from_linkedin_group
    require 'linkedin'
    client = Linkedin.new({
      :consumer_key => "zzzzzz",     # LinkedIn API key.
      :consumer_secret => "zzzzzzz",  # LinkedIn API secret.
      :access_token => "zzzzzzz",     # Authenticated user access token.
      :access_secret => "zzzzzz"     # Authenticated user access secret.
    })
    json = client.group
    puts json.inspect
    add_entries(json)
  end
  private

  def self.add_entries(values)
    values.each do |value|
      unless exists? guid: value.id
        create!(
          title: value.title,
          guid: value.id
        )
      end
    end
  end
end
class Linkedin
  require 'oauth'
  require 'active_support'
  require 'json'
  def initialize(config)
    consumer = OAuth::Consumer.new(config[:consumer_key], config[:consumer_secret], {
      :site => 'https://api.linkedin.com',
      :authorize_path => '/uas/oauth/authorize',
      :request_token_path => '/uas/oauth/requestToken',
      :access_token_path => '/uas/oauth/accessToken'
        })
    @client = OAuth::AccessToken.new(consumer, config[:access_token], config[:access_secret])
  end

  def group
    request(:get, '/groups/4896676/posts?order=recency&category=discussion&format=json')
  end

  private
    def request(method, path)
      JSON.parse(@client.request(method, 'https://api.linkedin.com/v1' + path).body)
    end
end
1.9.3p374 :001 > Article.update_from_linkedin_group
{"_count"=>10, "_start"=>0, "_total"=>95, "values"=>[{"creator"=>{"firstName"=>"Brian", "headline"=>"Reach AngularJS Developers Via @AngularJobs", "id"=>"Cg70QGPa6j", "lastName"=>"Petro", "pictureUrl"=>"http://m3.licdn.com/mpr/mprx/0_CV5yQJidyeFzm-JZC0zfQsGEpa3v2qZZhZliQU1Miez51K74apvKHRbB-iTE71MN_JbCWpSkwG2e"}, "id"=>"g-4896676-S-240161182", "title"=>"A Reusable Bootstrap Modal AngularJS Directive for Forms", "type"=>{"code"=>"standard"}}, {"creator"=>{"firstName"=>"Brian", "headline"=>"Reach AngularJS Developers Via @AngularJobs", "id"=>"Cg70QGPa6j", "lastName"=>"Petro", "pictureUrl"=>"http://m3.licdn.com/mpr/mprx/0_CV5yQJidyeFzm-JZC0zfQsGEpa3v2qZZhZliQU1Miez51K74apvKHRbB-iTE71MN_JbCWpSkwG2e"}, "id"=>"g-4896676-S-240017185", "title"=>"Testing AngularJS", "type"=>{"code"=>"standard"}}, {"creator"=>{"firstName"=>"Brian", "headline"=>"Reach AngularJS Developers Via @AngularJobs", "id"=>"Cg70QGPa6j", "lastName"=>"Petro", "pictureUrl"=>"http://m3.licdn.com/mpr/mprx/0_CV5yQJidyeFzm-JZC0zfQsGEpa3v2qZZhZliQU1Miez51K74apvKHRbB-iTE71MN_JbCWpSkwG2e"}, "id"=>"g-4896676-S-240016428", "title"=>"AngularJS: Managing Feeds", "type"=>{"code"=>"standard"}}, {"creator"=>{"firstName"=>"Brian", "headline"=>"Reach AngularJS Developers Via @AngularJobs", "id"=>"Cg70QGPa6j", "lastName"=>"Petro", "pictureUrl"=>"http://m3.licdn.com/mpr/mprx/0_CV5yQJidyeFzm-JZC0zfQsGEpa3v2qZZhZliQU1Miez51K74apvKHRbB-iTE71MN_JbCWpSkwG2e"}, "id"=>"g-4896676-S-240016505", "title"=>"HashKeyCopier - An AngularJS Utility Class For Merging Cached And...", "type"=>{"code"=>"standard"}}, {"creator"=>{"firstName"=>"Brian", "headline"=>"Reach AngularJS Developers Via @AngularJobs", "id"=>"Cg70QGPa6j", "lastName"=>"Petro", "pictureUrl"=>"http://m3.licdn.com/mpr/mprx/0_CV5yQJidyeFzm-JZC0zfQsGEpa3v2qZZhZliQU1Miez51K74apvKHRbB-iTE71MN_JbCWpSkwG2e"}, "id"=>"g-4896676-S-240016218", "title"=>"« Building Huuuuuge Apps with AngularJS", "type"=>{"code"=>"standard"}}, {"creator"=>{"firstName"=>"Brian", "headline"=>"Reach AngularJS Developers Via @AngularJobs", "id"=>"Cg70QGPa6j", "lastName"=>"Petro", "pictureUrl"=>"http://m3.licdn.com/mpr/mprx/0_CV5yQJidyeFzm-JZC0zfQsGEpa3v2qZZhZliQU1Miez51K74apvKHRbB-iTE71MN_JbCWpSkwG2e"}, "id"=>"g-4896676-S-240015464", "title"=>"Building a Spreadsheet in 20 Minutes with Angular.js", "type"=>{"code"=>"standard"}}, {"creator"=>{"firstName"=>"Brian", "headline"=>"Reach AngularJS Developers Via @AngularJobs", "id"=>"Cg70QGPa6j", "lastName"=>"Petro", "pictureUrl"=>"http://m3.licdn.com/mpr/mprx/0_CV5yQJidyeFzm-JZC0zfQsGEpa3v2qZZhZliQU1Miez51K74apvKHRbB-iTE71MN_JbCWpSkwG2e"}, "id"=>"g-4896676-S-239786186", "title"=>"5 reasons to use AngularJS in the corporate app world", "type"=>{"code"=>"standard"}}, {"creator"=>{"firstName"=>"Brian", "headline"=>"Reach AngularJS Developers Via @AngularJobs", "id"=>"Cg70QGPa6j", "lastName"=>"Petro", "pictureUrl"=>"http://m3.licdn.com/mpr/mprx/0_CV5yQJidyeFzm-JZC0zfQsGEpa3v2qZZhZliQU1Miez51K74apvKHRbB-iTE71MN_JbCWpSkwG2e"}, "id"=>"g-4896676-S-239786152", "title"=>"dangle.js", "type"=>{"code"=>"standard"}}, {"creator"=>{"firstName"=>"Brian", "headline"=>"Reach AngularJS Developers Via @AngularJobs", "id"=>"Cg70QGPa6j", "lastName"=>"Petro", "pictureUrl"=>"http://m3.licdn.com/mpr/mprx/0_CV5yQJidyeFzm-JZC0zfQsGEpa3v2qZZhZliQU1Miez51K74apvKHRbB-iTE71MN_JbCWpSkwG2e"}, "id"=>"g-4896676-S-239785986", "title"=>"nodejs-mongo-angular-crud", "type"=>{"code"=>"standard"}}, {"creator"=>{"firstName"=>"Milan", "headline"=>"Yii/API Ninja at Divide Nine / Divide Nine Studios", "id"=>"5AGK3AkNFA", "lastName"=>"Z.", "pictureUrl"=>"http://m3.licdn.com/mpr/mprx/0_EBP1XaLgxDUIlA4nH9z2Xub-gdO6PtHne1buXuv_C7o9u9096l_0E23SPXYJrvdswNlDIIIGuxTj"}, "id"=>"g-4896676-S-239768061", "title"=>"2. Incorporate It", "type"=>{"code"=>"standard"}}]}
NoMethodError: undefined method `id' for ["_count", 10]:Array
from /home/brian/apps/angularjobs/app/models/article.rb:19:in `block in add_entries'
from /home/brian/apps/angularjobs/app/models/article.rb:18:in `each'
from /home/brian/apps/angularjobs/app/models/article.rb:18:in `add_entries'
from /home/brian/apps/angularjobs/app/models/article.rb:13:in `update_from_linkedin_group'
from (irb):1
from /home/brian/.rvm/gems/ruby-1.9.3-p374/bundler/gems/rails-1e5ee397ff37/railties/lib/rails/commands/console.rb:90:in `start'
from /home/brian/.rvm/gems/ruby-1.9.3-p374/bundler/gems/rails-1e5ee397ff37/railties/lib/rails/commands/console.rb:9:in `start'
from /home/brian/.rvm/gems/ruby-1.9.3-p374/bundler/gems/rails-1e5ee397ff37/railties/lib/rails/commands.rb:66:in `<top (required)>'
from bin/rails:4:in `require'
from bin/rails:4:in `<main>'
1.9.3p374:001>linkedin集团的Article.update\u
{“{u count”=>10,{u start”=>0,{u total”=>95,“values”=>[{“creator”=>{“firstName”=>“Brian”,“headline”=>“通过@AngularJobs联系AngularJS开发者”,“id”=>“Cg70QGPa6j”,“lastName”=>“Petro”,“pictureUrl”=>”http://m3.licdn.com/mpr/mprx/0_CV5yQJidyeFzm-JZC0zfQsGEpa3v2qZZhZliQU1Miez51K74apvKHRbB-iTE71MN_JbCWpSkwG2e“},”id“=>“g-4896676-S-240161182”,“title”=>“用于表单的可重用引导模式AngularJS指令”,“type”=>{“code”=>“standard”},{“creator”=>{“firstName”=>“Brian”,“headline”=>“通过@AngularJobs联系AngularJS开发人员”,“id”=>“Cg70QGPa6j”,“lastName”=>“Petro”,“picturel”=>”http://m3.licdn.com/mpr/mprx/0_CV5yQJidyeFzm-JZC0zfQsGEpa3v2qZZhZliQU1Miez51K74apvKHRbB-iTE71MN_JbCWpSkwG2e“}”,id“=>”g-4896676-S-240017185“,”title“=>”Testing AngularJS“,”type“=>”{“code”=>”standard“}},{“creator”=>{“firstName”=>“Brian”,“headline”=>“Reach AngularJS开发者通过@AngularJobs”,“id”=>“Cg70QGPa6j”,“lastName”=>“Petro”,“pictureUrl”"=>"http://m3.licdn.com/mpr/mprx/0_CV5yQJidyeFzm-JZC0zfQsGEpa3v2qZZhZliQU1Miez51K74apvKHRbB-iTE71MN_JbCWpSkwG2e“},”id“=>”g-4896676-S-240016428“,”title“=>”AngularJS:管理提要“,”type“=>{”code“=>”standard“}},“{”creator“=>{”firstName“=>”Brian“,”headline“=>”通过@AngularJobs联系AngularJS开发者“,”id“=>”Cg70QGPa6j“,”lastName“=>”Petro”,“pictureUrl”=>“http://m3.licdn.com/mpr/mprx/0_CV5yQJidyeFzm-JZC0zfQsGEpa3v2qZZhZliQU1Miez51K74apvKHRbB-iTE71MN_JbCWpSkwG2e“},”id“=>”g-4896676-S-240016505“,”title“=>”HashKeyCopier-用于合并缓存和…”的AngularJS实用程序类“,”type“=>{”code“=>”standard“}}},{”creator“=>{”firstName“=>”Brian“,”headline“=>“通过@AngularJobs”、“id”=>“Cg70QGPa6j”、“lastName”=>“Petro”、“pictureUrl”=>”联系AngularJS开发者”http://m3.licdn.com/mpr/mprx/0_CV5yQJidyeFzm-JZC0zfQsGEpa3v2qZZhZliQU1Miez51K74apvKHRbB-iTE71MN_JbCWpSkwG2e“},”id“=>”g-4896676-S-240016218“,”标题“=>”«使用AngularJS构建HuuUuge应用程序“,”键入“=>{”代码“=>”标准“}},{”创建者“=>{”firstName“=>”Brian“,”headline“=>”通过@AngularJobs联系AngularJS开发者“,”id“=>”Cg70QGPa6j“,”lastName“=>”Petro“,”pictureUrl“=>”http://m3.licdn.com/mpr/mprx/0_CV5yQJidyeFzm-JZC0zfQsGEpa3v2qZZhZliQU1Miez51K74apvKHRbB-iTE71MN_JbCWpSkwG2e“},”id“=>”g-4896676-S-240015464“,”title“=>”使用Angular.js在20分钟内构建电子表格“,”键入“=>{”code“=>”standard“}},{”creator“=>{”firstName“=>”Brian“,”headline“=>”通过@AngularJobs联系AngularJS开发者“,”id“=>”Cg70QGPa6j“,”lastName“=>”Petro“,”pictureUrl“=>”http://m3.licdn.com/mpr/mprx/0_CV5yQJidyeFzm-JZC0zfQsGEpa3v2qZZhZliQU1Miez51K74apvKHRbB-iTE71MN_JbCWpSkwG2e“},“id”=>“g-4896676-S-239786186”,“标题”=>“在企业应用程序世界中使用AngularJS的5个原因”,“键入”=>{“代码”=>“标准”},{“创建者”=>{“名字”=>“Brian”,“标题”=>“通过@AngularJobs联系AngularJS开发者”,“id”=>“Cg70QGPa6j”,“姓氏”=>“Petro”,“pictureUrl”=>”http://m3.licdn.com/mpr/mprx/0_CV5yQJidyeFzm-JZC0zfQsGEpa3v2qZZhZliQU1Miez51K74apvKHRbB-iTE71MN_JbCWpSkwG2e"}, "id“=>”g-4896676-S-239786152“,”title“=>”dangle.js“,”type“=>”{”code“=>”standard“}},“{”creator“=>”{”firstName“=>”Brian“,”headline“=>”通过@AngularJobs联系AngularJS开发者“,”id“=>”Cg70QGPa6j“,”lastName“=>”Petro“,”pictureUrl“=>”http://m3.licdn.com/mpr/mprx/0_CV5yQJidyeFzm-JZC0zfQsGEpa3v2qZZhZliQU1Miez51K74apvKHRbB-iTE71MN_JbCWpSkwG2e“}”,id“=>”g-4896676-S-239785986“,”title“=>”nodejs mongo angular crud“,”type“=>”{”code“=>”standard“},“{”creator“=>”{”firstName“=>”米兰“,”headline“=>”Yii/API忍者在Divide Nine/Divide Nine工作室“,”id“=>”5AGK3AkNFA“,”lastName“=>”Z.,”pictureUrl“=>"http://m3.licdn.com/mpr/mprx/0_EBP1XaLgxDUIlA4nH9z2Xub-gdO6PtHne1buXuv_C7o9u9096l_0E23SPXYJrvdswNlDIIIGuxTj“},”id“=>”g-4896676-S-239768061“,”标题“=>”2.合并它“,”类型“=>{”代码“=>”标准“}}]}”
NoMethodError:[“\u count”,10]:数组的未定义方法'id'
from/home/brian/apps/angularjobs/app/models/article.rb:19:in‘block in add_条目’
from/home/brian/apps/angularjobs/app/models/article.rb:18:in'each'
from/home/brian/apps/angularjobs/app/models/article.rb:18:in“添加条目”
from/home/brian/apps/angularjobs/app/models/article.rb:13:in'update_from_linkedin_group'
来自(irb):1
from/home/brian/.rvm/gems/ruby-1.9.3-p374/bundler/gems/rails-1e5ee397ff37/railties/lib/rails/commands/console.rb:90:in'start'
from/home/brian/.rvm/gems/ruby-1.9.3-p374/bundler/gems/rails-1e5ee397ff37/railties/lib/rails/commands/console.rb:9:in'start'
from/home/brian/.rvm/gems/ruby-1.9.3-p374/bundler/gems/rails-1e5ee397ff37/railties/lib/rails/commands.rb:66:in`'
从箱子/轨道:4:in“require”
从箱子/轨道:4:in`'
在文章#add#u entries方法中,您正在调用#全部返回的JSON。您要做的是在JSON哈希的“values”键上调用#each,然后从其中的每个哈希中提取id和标题。因此它可能看起来像这样:

values["values"].each do |value|
  unless exists? guid: value['id']
    create!(
      title: value['title'],
      guid: value['id']
    )
  end
end