30195


はじめまして。

前提・実現したいこと

facebookのログイン認証を実装したのですが、思うような機能をしてくれないので  
ご相談させていただきます。

発生している問題・エラーメッセージ

下記、コードの条件分岐が何度繰り返してもelseになり、  
登録画面にリダイレクトされてしまいます。

どうして、@user.persisted?がfalseになってしまうのかを知りたいです。

①一度、認証リンクを押しました。  
そこで、facebookページに飛び、ログインせずにキャンセルを押してしまったので、  
elseになってしまうのでしょうか？

②もう一つのモデル(deviseの複数モデルで開発してます)では、facebookページに飛び、ログインをしたのですが、エラーがありうまく認証できませんでした。  
もう一度認証を試すと、elseでリダイレクトコースです…

[code]

    def facebook
          # You need to implement the method below in your model (e.g.            
    app/models/user.rb)
          @user = User.from_omniauth(request.env["omniauth.auth"])
    
          if @user.persisted? ←★なぜfalseになってしまうのか？★
            sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated
            set_flash_message(:notice, :success, :kind => "Facebook") if 
    is_navigational_format?
          else ←★すべて条件分岐先がelseになってしまう。★
            session["devise.facebook_data"] = request.env["omniauth.auth"]
            redirect_to new_user_registration_url
          end
      end
    
[/code]

試したこと

・persisted？をリファレンスで確認したところ、新しいレコードかどうかをチェックするとありました。そこで、rake
db:migrate:resetでデータベースを削除してもう一度、ログイン認証を試しましたがリダイレクトされてしまいました。

補足情報(言語/FW/ツール等のバージョンなど)

①開発環境です。  
②deviseを使い複数モデルを作っています。  
③参考サイト  
Rails4でOmniAuthを使用したFacebookログイン機能を実装する  
OmniAuthでFacebook認証を複数のモデルで使う  
既存のDevise認証アプリに OmniAuth認証を追加する  
Railsのログイン認証gemのDeviseとOmniAuth-Twitterの連携（Twitterでログインする）

よろしくお願いします！

情報追加

【user.rb】

[code]

    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]
        end
    end
    
[/code]


CC BY-SA 3.0
2016-11-07T01:56:26.400
30172
2016-11-07T15:15:46.960
2016-11-07T04:54:00.470
19459
19459
question
ruby-on-rails twitter facebook
条件分岐中のpersisted?をtrueにできない


おそらく `first_or_create` の `create` 側で失敗しているので `first_or_create` を
`first_or_create!` に変えて、例外が出るかどうか確かめてみたらよいと思います。


CC BY-SA 3.0
2016-11-07T15:15:46.960
30195
2016-11-07T15:15:46.960
17037
30172
answer