Rails Koala - 为#<User: 获取一个未定义的方法 `oauth_token='

Rails Koala - Getting a undefined method `oauth_token=' for #<User:

对于新手问题深表歉意。我正在尝试在我的应用程序中使用 Koala gem。目前,我有 devise 和 omniauth(用于 facebook 登录)。他们工作得很好——我可以很容易地注册用户。不过,我现在想做的是利用 Koala 从我登录的用户那里获取对 Facebook 数据的访问权限。但是,我收到错误消息“未定义的方法 `oauth_token=' for #

User.rb

class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, :omniauthable, omniauth_providers: [:facebook]

  def self.from_omniauth(auth)
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
      user.email = auth.info.email
      user.password = Devise.friendly_token[0,20]
      user.username = auth.info.name     
      user.avatar = URI.parse(auth.info.image)
      user.oauth_token = auth.credentials.token #Added this after learning about Koala
    end
  end

  def facebook
    @facebook ||= Koala::Facebook::API.new(oauth_token)
  end
end

Application_Controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  before_action :configure_permitted_parameters, if: :devise_controller?
  before_filter :set_body_class
  before_filter :set_current_user

  def set_current_user
    User.current_user = current_user
  end

  def set_body_class
    @body_class = "#{controller_name} #{action_name}"
  end

  protected

  def after_sign_in_path_for(resource)
    # request.env['omniauth.origin'] || stored_location_for(resource) || root_path
    items_path
  end

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:username, :name, :avatar])
    devise_parameter_sanitizer.permit(:account_update, keys: [:username,:name, :avatar])
  end
end

Schema.rb

create_table "users", force: :cascade do |t|
  t.string   "email",                  default: "", null: false
  t.string   "encrypted_password",     default: "", null: false
  t.string   "reset_password_token"
  t.datetime "reset_password_sent_at"
  t.datetime "remember_created_at"
  t.integer  "sign_in_count",          default: 0,  null: false
  t.datetime "current_sign_in_at"
  t.datetime "last_sign_in_at"
  t.string   "current_sign_in_ip"
  t.string   "last_sign_in_ip"
  t.datetime "created_at",                          null: false
  t.datetime "updated_at",                          null: false
  t.string   "avatar_file_name"
  t.string   "avatar_content_type"
  t.integer  "avatar_file_size"
  t.datetime "avatar_updated_at"
  t.string   "username"
  t.string   "provider"
  t.string   "uid"
  t.index ["email"], name: "index_users_on_email", unique: true
  t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
end

迁移 AddOmniauthToUsers

class AddOmniauthToUsers < ActiveRecord::Migration[5.0]
  def change
    add_column :users, :provider, :string
    add_column :users, :uid, :string
  end
end

尝试拨打 self.outh_token。 outh_token 属于一个用户,除非您将用户作为参数传递或使用 "self" 自行调用它,否则 Rails 不知道 outh_token 属于哪里。

  def facebook
    @facebook ||= Koala::Facebook::API.new(self.oauth_token)
  end

  def facebook(user)
    @facebook ||= Koala::Facebook::API.new(user.oauth_token)
  end