0

我的 session_controller 如下:

class SessionsController < ApplicationController
require 'omniauth-facebook'
require 'omniauth'
def create
@user = User.find_or_create_from_auth_hash(auth_hash)
self.current_user = @user
redirect_to '/'
end

protected

def auth_hash
request.env['omniauth.auth']
end
end

所以……不是吗?

这是我的 users.rb 文件:

class User < ActiveRecord::Base
acts_as_voter
# Include default devise modules. Others available are:
# :token_authenticatable, :confirmable,
# :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, :omniauthable

# Setup accessible (or protected) attributes for your model
attr_accessible :email, :password, :password_confirmation, :remember_me
# attr_accessible :title, :body
has_many :posts
has_many :tasks
end

我的路线文件:

LiquidAdmin::Application.routes.draw do
devise_for :users

get '/auth/:provider/callback', to: 'sessions#create'

resource :sessions, :only => :create

get "home/bandwall"
get "home/index"
root :to => "home#index"

那么问题出在哪里?“auth_hash”已明确定义...... SessionsController 正在加载......那么为什么它抱怨没有 find_or_create_from_auth_hash 的方法?

4

2 回答 2

3

在 Rails 3.2 中,您要使用的方法称为first_or_create

User.where(auth_hash: auth_hash).first_or_create

根据Rails 3.2 发行说明

将 first_or_create、first_or_create!、first_or_initialize 方法添加到 Active Record。这是比旧的 find_or_create_by 动态方法更好的方法,因为它更清楚哪些参数用于查找记录以及哪些参数用于创建记录。

鉴于此,可以通过查询进行以下操作:

User.where(auth_hash: auth_hash).first_or_create(foo: 'bar') # Assuming no other User entries exist
#=> #<User id: 1, auth_hash: "your_auth_hash", foo: "bar">

User.where(auth_hash: auth_hash).first_or_create(foo: 'baz')
#=> #<User id: 1, auth_hash: "your_auth_hash", foo: "bar">
于 2013-07-01T07:34:03.037 回答
2

鉴于此问题基于 OmniAuth,我认为更好的答案是:

@user = User.where(auth_hash).first_or_create

或者如果 Rails 版本大于 4.1.14

@user = User.where(uid: auth_hash[:uid], provider: auth_hash[:provider]).first_or_create

auth_hash不是模型中的字段User,而是模型Hash中可能存在的字段User

于 2015-02-24T16:56:24.627 回答