0

これが私のモデルです

class User < ActiveRecord::Base
  def self.from_omniauth(auth)
    where(auth.slice(:provider, :uid)).first_or_initialize.tap do |user|
      user.provider = auth.provider
      user.uid = auth.uid
      user.name = auth.info.name
      user.oauth_token = auth.credentials.token
      user.oauth_expires_at = Time.at(auth.credentials.expires_at)
      user.save!
    end
  end
end

これが私のコントローラーです

class SessionsController < ApplicationController
  def create
    user = User.from_omniauth(env["omniauth.auth"])
    session[:user_id] = user.id
    redirect_to root_url
  end

 def destroy
   session[:user_id] = nil
   redirect_to root_url
 end
 end

重複したエントリが作成されていないか、データベースを調べてみました。しかし、いいえ。お手伝いできることがあればお知らせください。

4

1 に答える 1

0

where(条件) を次のように変更するだけです。

where(provider: auth.provider, uid: auth.uid)

メソッド #permitted? が原因で、最初のアプローチは失敗します。属性をサニタイズするためにどの AR を呼び出すか (定義されている場合)。

> h = auth.slice(:provider, :uid)
> h.class
=> OmniAuth::AuthHash < Hashie::Mash
> h.permmitted?
> false

ただし、単純なハッシュには #permitted? がありません。定義されているため、そのまま続行します。

> h = { provider: auth.provider, uid: auth.uid }
> h2.permitted?
NoMethodError: undefined method `permitted?' for {:provider=>"facebook", :uid=>"XXXX"}:Hash

参考:https ://github.com/rails/rails/blob/master/activemodel/lib/active_model/forbidden_​​attributes_protection.rb#L19 )

于 2015-07-27T01:03:20.450 に答える