quick question: i'm using the linkedin gem to pull user data, but my app breaks if a particular data field is blank on the user's linkedin profile. is there an optimal way to scan each profile for blankness in all data fields and pull only those that are present to prevent breaking?
here is my auth_controller...i know it is not DRY and in need of refactoring. Thanks!
require 'linkedin'
class AuthController < ApplicationController
def index
client = LinkedIn::Client.new(ENV['LINKEDIN_KEY'], ENV['LINKEDIN_SECRET'])
request_token = client.request_token(:oauth_callback =>
"http://#{request.host_with_port}/callback")
session[:rtoken] = request_token.token
session[:rsecret] = request_token.secret
redirect_to client.request_token.authorize_url
end
def callback
client = LinkedIn::Client.new(ENV['LINKEDIN_KEY'], ENV['LINKEDIN_SECRET'])
if session[:atoken].nil?
pin = params[:oauth_verifier]
atoken, asecret = client.authorize_from_request(session[:rtoken], session[:rsecret], pin)
session[:atoken] = atoken
session[:asecret] = asecret
else
client.authorize_from_access(session[:atoken], session[:asecret])
end
current_user = client.profile(:fields => %w(positions educations))
@user = current_user
educations = current_user.educations.all
positions = current_user.positions.all
companies = current_user.positions.all.map{ |t| t.company }
@current_company = companies[0]['name']
@past_company_one = companies[1]['name']
@past_company_two = companies[2]['name']
@past_company_three = companies[3]['name']
@current_industry = companies[0]['industry']
@past_industry_one = companies[1]['industry']
@past_industry_two = companies[2]['industry']
@past_industry_three = companies[3]['industry']
@first_name = client.profile(:fields => ["first_name"]).first_name
@last_name = client.profile(:fields => ["last_name"]).last_name
@headline = client.profile(:fields => ["headline"]).headline
@picture = client.profile(:fields => ["picture-url"]).picture_url
@school_one_name = educations[0]['school-name']
@school_one_degree = educations[0]['degree']
@school_one_field = educations[0]['field-of-study']
@school_one_start = educations[0]['start-date']['year'].to_s
@school_one_end = educations[0]['end-date']['year'].to_s
@school_two_name = educations[1]['school-name']
@school_two_degree = educations[1]['degree']
@school_two_field = educations[1]['field-of-study']
@school_two_start = educations[1]['start-date']['year'].to_s
@school_two_end = educations[1]['end-date']['year'].to_s
@current_title = positions[0]['title']
@past_title_one = positions[1]['title']
@past_title_two = positions[2]['title']
@past_title_three = positions[3]['title']
@current_start_date = Date::MONTHNAMES[positions[0]['start-date']['month']] + " " + positions[0]['start-date']['year'].to_s
@past_start_date_one = Date::MONTHNAMES[positions[1]['start-date']['month']] + " " + positions[1]['start-date']['year'].to_s
@past_end_date_one = Date::MONTHNAMES[positions[1]['end-date']['month']] + " " + positions[1]['end-date']['year'].to_s
@past_start_date_two = Date::MONTHNAMES[positions[2]['start-date']['month']] + " " + positions[2]['start-date']['year'].to_s
@past_end_date_two = Date::MONTHNAMES[positions[2]['end-date']['month']] + " " + positions[2]['end-date']['year'].to_s
@past_start_date_three = Date::MONTHNAMES[positions[3]['start-date']['month']] + " " + positions[3]['start-date']['year'].to_s
@past_end_date_three = Date::MONTHNAMES[positions[3]['end-date']['month']] + " " + positions[3]['end-date']['year'].to_s
end
end
considering your current code may break upon any unexpected values in the response and assuming it's happening in your above callback
method, you may consider just applying quick'n'dirty exception handling to your code.
for example, by simply enclosing the potentially offending code in a begin
/ end
block and using a rescue
clause to handle any exceptions:
def callback
client = LinkedIn::Client.new(ENV['LINKEDIN_KEY'], ENV['LINKEDIN_SECRET'])
if session[:atoken].nil?
# ...code
else
#...code
end
# start handling exceptions here
begin
# ...potentially offending code here
current_user = client.profile(:fields => %w(positions educations))
# ...more code
@past_end_date_three = Date::MONTHNAMES[positions[3]['end-date']['month']] + " " + positions[3]['end-date']['year'].to_s
rescue
# oops, something happened:
# ...your code to handle the exception here
end
end
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.