【问题标题】:Rails Koala - Getting a undefined method `oauth_token=' for #<User:Rails Koala - 为 #<User: 获取未定义的方法 `oauth_token='
【发布时间】:2017-03-06 00:26:12
【问题描述】:

为初学者的问题道歉。我正在尝试在我的应用程序上使用 Koala gem。目前,我有设计和omniauth(用于facebook登录)。他们工作得很好——我可以很容易地注册用户。不过,我现在想做的是利用考拉从我的登录用户那里获取对 Facebook 数据的访问权限。但是,我收到一个错误“未定义的方法 `oauth_token=' for #

用户.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

【问题讨论】:

    标签: ruby-on-rails ruby facebook koala


    【解决方案1】:

    尝试调用 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
    

    【讨论】:

    • 非常感谢您的回复。第二个选择并没有给我旧的错误,但是在我的控制台中,当我执行 u.facebook.get_object("me") 时,我收到以下新错误“ArgumentError:参数数量错误(给定 0,预期为 1)”
    • 在第二个选项中,facebook 需要一个用户 User.facebook(user)。它期望你传递一个论点。该参数必须是用户。你也可以试试 u.facebook(self)。
    • 我认为我们非常接近 - 当我执行 u.facebook(u).get_object("me") - 我在控制台上收到此错误,我认为这与 user.rb 添加有关我所做的(将屏幕截图附加到显示我的铁路日志的原始问题)-> NoMethodError: undefined method `oauth_token' for #<0x007fc4681ad770>
    猜你喜欢
    • 1970-01-01
    • 2017-01-22
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 2014-11-17
    相关资源
    最近更新 更多