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

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

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

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Twitter

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

Facebook

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

Ruby on Rails 4

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

解決済

persist?がfalseになる原因。

s.k
s.k

総合スコア423

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Twitter

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

Facebook

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

Ruby on Rails 4

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

2回答

0リアクション

0クリップ

3369閲覧

投稿2016/11/07 10:24

以下、①、②以外の原因を教えていただきたいです。

###前提・実現したいこと
persist?の結果をtrueにしたい。

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

persist?が返す値が、毎度falseになってしまいます。
調べたところ、falseを返す原因は大きく分けて2つだとわかりました。
①モデル構築しか行われていない(save or createがない)
②validationが働いて①の妨げになってしまっている。

①、②の問題が発生しているか確認をしましたが、
どうやらないようです。

persist?が他にfalseになる原因が他にもあるのかをこの質問を読んでくださった方にお聞きしたいです。

###該当のソースコード

【users_controller.rb】

def facebook user = User.from_omniauth(request.env["omniauth.auth"])←★from_omniauthに原因があるはず。★ if user.persisted? ←★falseになり、elseの処理しか行われない。★ sign_in_and_redirect user set_flash_message(:notice, :success, kind: __callee__.to_s.capitalize) if is_navigational_format? else←★いつもこの処理が実行されてしまう。★ session["devise.user_attributes"] = user.attributes redirect_to new_user_registration_url(from_omniauth_callback: "1") end end

【user.rb】

ruby

devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable def self.from_omniauth(auth) where(provider: auth.provider, uid: auth.uid).first_or_create do |user| ←first_or_createがあるので①の問題は発生していない…? user.provider = auth.provider user.uid = auth.uid end end

【omniauth.rb】

ruby

Rails.application.config.middleware.use OmniAuth::Builder do require 'omniauth/strategies/facebook_another' provider :facebook, "ID", "KEY" provider :facebook_another, "ID", "KEY" end

###試したこと
①【user.rb】のself.from_omniauthメソッドでデータがきちんと保存されているかを確認するため条件分岐を書きましたが、エラーがでてできませんでした…

###補足情報(言語/FW/ツール等のバージョンなど)
①user.rbにはvalidationを書いていないので②の問題も発生していないと思われます。
②Userテーブルにはproviderとuidカラムは存在します。
③deviseで複数モデルを実装してます。deviseでのOmniAuthは単一モデルにしか対応できないそうなので。
④関連する質問はこちら

###情報追加

hana-daさんへ

見づらくて申し訳ありません((+_+))

ruby

class User < ActiveRecord::Base # Include default devise modules. Others available are: #microposts has_many :microposts, dependent: :destroy #plugin(SNS omuniauth) has_many :social_profiles, dependent: :destroy ##コメント機能 #comment(user-to-micropost.user) has_many :comments #call(user-to-micropost.shop) has_many :calls #says(shop-to-micropost.shop) has_many :says #insists(shop-to-micropost.user) has_many :insists #relationship(users-to-users) has_many :active_relationships, class_name: "Relationship", foreign_key: "follower_id", dependent: :destroy has_many :passive_relationships, class_name: "Relationship", foreign_key: "followed_id", dependent: :destroy has_many :following, through: :active_relationships, source: :followed #フォローしている人を表示できるメソッドを関連づける has_many :followers, through: :passive_relationships, source: :follower #フォローされている人を表示できるメソッドを関連付ける #associates(user-to-shop) has_many :shops has_many :associates, dependent: :destroy has_many :associate_shops, through: :associates, source: :shop #makes(shop-to-user) has_many :makes, dependent: :destroy has_many :make_shops, through: :makes, source: :shop #praises(user-to-micropost) has_many :praises, dependent: :destroy has_many :praise_microposts, through: :praises, source: :micropost #evaluates(user-to-micropost) has_many :evaluates, dependent: :destroy has_many :evaluate_microposts, through: :evaluates, source: :micropost devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable def self.from_omniauth(auth)★★ where(provider: auth.provider, uid: auth.uid).first_or_create do |user| ←first_or_create user.provider = auth.provider user.uid = auth.uid end end user end def password_required? super && provider.blank? # provider属性に値があればパスワード入力免除 end def self.new_with_session(params, session) super.tap do |user| if data = session["devise.facebook_data"] && session["devise.facebook_data"]["extra"]["raw_info"] user.email = data["email"] if user.email.blank? end end end def feed following_ids = "SELECT followed_id FROM relationships WHERE follower_id = :user_id" associate_shops_ids = "SELECT shop_id FROM associates WHERE user_id = :user_id" Micropost.where("user_id IN (#{following_ids}) OR shop_id IN (#{associate_shops_ids}) OR user_id = :user_id", user_id: id) end #follow def follow(other_user) active_relationships.create(followed_id: other_user.id) end def unfollow(other_user) active_relationships.find_by(followed_id: other_user.id).destroy end def following?(other_user) following.include?(other_user) end #お気に入りしているかどうかを、返すメソッド(shop-to-user) def maked_by? shop makes.where(shop_id: shop.id).exists? end end

よろしくお願いします。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Twitter

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

Facebook

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

Ruby on Rails 4

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