質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Facebook

Facebookは、実名登録制のSNS(ソーシャル・ネットワーキング・サービス)です。開発者用のデベロッパーサイトが存在し、一般ユーザーによるFacebook向けアプリケーション開発が可能です。

プラグイン

プラグイン(plug-in)は、ソフトウェアアプリケーションの機能拡張の為に開発された、一組のソフトウェアコンポーネントのことを指します。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

2回答

2498閲覧

条件分岐中のpersisted?をtrueにできない

s.k

総合スコア423

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Facebook

Facebookは、実名登録制のSNS(ソーシャル・ネットワーキング・サービス)です。開発者用のデベロッパーサイトが存在し、一般ユーザーによるFacebook向けアプリケーション開発が可能です。

プラグイン

プラグイン(plug-in)は、ソフトウェアアプリケーションの機能拡張の為に開発された、一組のソフトウェアコンポーネントのことを指します。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2016/11/05 08:49

編集2016/11/07 03:28

2日悩んでます。
###前提・実現したいこと
facebookのログイン認証を実装したのですが、思うような機能をしてくれないので
ご相談させていただきます。

###発生している問題・エラーメッセージ
下記、コードの条件分岐が何度繰り返してもelseになり、
登録画面にリダイレクトされてしまいます。

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

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

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

Ruby

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

###試したこと
①persisted?をリファレンスで確認したところ、新しいレコードかどうかをチェックするとありました。そこで、rake db:migrate:resetでデータベースを削除してもう一度、ログイン認証を試しましたがリダイレクトされてしまいました。
②facebookアプリに何か問題があるのかと思いましたので、別のアプリを製作し、IDとPASSを差し替えましたが効果なしです。
③情報追加部分のメソッド内にuser.saveを追加しました。しかし、リダイレクト現象は解決しませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)
①開発環境です。
②deviseを使い複数モデルを作っています。
③参考サイト
Rails4でOmniAuthを使用したFacebookログイン機能を実装する
OmniAuthでFacebook認証を複数のモデルで使う
既存のDevise認証アプリに OmniAuth認証を追加する
Railsのログイン認証gemのDeviseとOmniAuth-Twitterの連携(Twitterでログインする)
④validationはかけていません。

よろしくお願いします!

###情報追加

★maisumakunさんへ★

【user.rb】

ruby

1 def self.from_omniauth(auth) 2 where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 3 user.email = auth.info.email 4 user.password = Devise.friendly_token[0,20] 5 end 6end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

User.from_omniauthの中身がわからないと何とも言えない部分はありますが、その中では「モデル構築だけ」やっているのではないでしょうか。

@user.saveのような形でDBへ保存しなければ、いつまでたっても@user.persisted?はfalseのままです。あと、バリデーションに引っかかったなどで保存されないときも@user.persisted?はfalseです。

投稿2016/11/05 09:03

編集2016/11/05 09:05
maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

s.k

2016/11/05 09:11

maisumakunさん お返事ありがとうございます! 今、指摘された箇所を確認してみます! 【User.from_omniauth】 は追加しておきました!
maisumakun

2016/11/05 09:16

新規作成された分にはemailとpasswordの2列があるようですが、バリデーションの方はどうでしょうか。
s.k

2016/11/05 09:24

validationはかけないで開発をしていました!
guest

0

maisumakunさん

やはり、validationでした。
詳しくはこちらの質問の自己解決策をご覧ください

ありがとうございました!

投稿2016/11/08 01:49

s.k

総合スコア423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問