Как извлечь / перебрать и сохранить позиции пользователей в модели с LinkedIn? omniauth-linkedin-oauth2 Rails 5.2

Мне удалось завершить процесс входа в систему oauth2 и предоставить доступ current_user к приложению с помощью Devise. Моя главная цель состояла в том, чтобы перебрать позиции пользователя из LinkedIn и создать объект Position.create (..) для каждой отдельной позиции, а затем сохранить их user_id в объект после успешной попытки входа в LinkedIn. После этого я просто отобразил бы информацию внутри приложения. Он должен проверить позицию, где находится first_or_create, чтобы избежать дублирования данных при каждой попытке входа в систему. Как я могу получить позиции пользователя и хэш компании (объект JSON) для хранения внутри базы данных?

Я создал модель позиции с сериализуемым атрибутом компании JSON. Я попытался получить профиль пользователя, используя поля auth.extra.info.positions. После этого я попытался получить информацию от пользователя в сеансе. Я не смог добиться возврата массива позиций.

create_positions.rb | миграция

class CreatePositions < ActiveRecord::Migration[5.2]
  def change
    create_table :positions do |t|
      t.string :title
      t.text :summary
      t.date :start_date
      t.date :end_date
      t.boolean :is_current
      t.json :company
      t.references :user, foreign_key: true

      t.timestamps
    end
  end
end

user.rb

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable, :omniauthable, :trackable, :confirmable,
         :omniauth_providers => [:twitter, :facebook, :linkedin, :google_oauth2,
                                 *(:developer if Rails.env.development?)]

  has_many :positions

  def self.from_omniauth(auth)
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
      user.email = auth.info.email
      user.name = auth.info.name
      user.password = Devise.friendly_token[0, 20]
      user.provider = auth.provider
      user.uid = auth.uid
    end
  end

  protected
  def confirmation_required?
    false
  end
end

position.rb

class Position < ApplicationRecord
  serialize :company, JSON
  belongs_to :user, dependent: :destroy
 end

omniauth_callbacks_controller.rb

# frozen_string_literal: true

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  skip_before_action :verify_authenticity_token

  def sign_in_with(provider_name)
    @user = User.from_omniauth(request.env['omniauth.auth'])
    sign_in_and_redirect @user, event: :authentication
    set_flash_message(:notice, :success, kind: provider_name) if is_navigational_format?
  end

  def save_user_positions
     Position.create(:title => auth.extra.info.positions['title'], :summary => auth.extra.info.positions['summary'], :start_date => auth.extra.info.positions['start-date'], :end_date => auth.extra.info.positions['end-date'], :is_current => auth.extra.info.positions['is-current'], company: {id: auth.extra.info.positions.company['id']})

end def facebook sign_in_with 'Facebook' end

  def linkedin
    sign_in_with 'LinkedIn'
  end

  def twitter
    sign_in_with 'Twitter'
  end

  def google_oauth2
    sign_in_with 'Google'
  end

  def developer
    sign_in_with 'Developer'
  end
end

Ожидаемые результаты: когда пользователь входит в LinkedIn через omniauth, его позиции / компании сохраняются в базе данных rails.

Фактические результаты: только электронная почта пользователя / имя / основные атрибуты могут быть восстановлены.

0 ответов

Другие вопросы по тегам