0

私がやりたいことは、LinkedIn のタイトルとグループ投稿の ID を Article モデルに保存することだけです。これは次の場合に発生します。

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

懸念/linkedin.rb:

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>'
4

1 に答える 1