2013-05-12 57 views
0

我想要做的就是將LinkedIn標題和組標題的標識存儲到我的文章模型中。這應該發生在:LinkedIn API JSON - 我做錯了什麼?

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

回答

1

在文章#add_entries方法您調用#each在整個返回的JSON。你想要做的就是在JSON哈希的「值」鍵上調用#each,然後從其中的每個哈希中提取ID和標題。所以它可能看起來像這樣:

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