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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RubyGems

RubyGemsはRubyによるプログラミングのためのパッケージマネジメントツールです。ユーザはこれを使用することで、Rubyライブラリのダウンロードやアップデートや、依存関係の自動解決が可能になります。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

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

Q&A

解決済

1回答

858閲覧

Devise OAuth認証の場合userにidを付与できない

NishidaRyu416_

総合スコア113

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RubyGems

RubyGemsはRubyによるプログラミングのためのパッケージマネジメントツールです。ユーザはこれを使用することで、Rubyライブラリのダウンロードやアップデートや、依存関係の自動解決が可能になります。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

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

0グッド

0クリップ

投稿2017/04/05 09:19

ソース
##問題
通常の登録だと、userにidを発行できるが、twitter,facebookなどだとidを付与できずshowアクションなどがうまく使えません.
回答よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

認証時に相当するUserがいなければ、作るといった形でいいのではないですか?
参考サイト

投稿2017/04/05 10:01

moke

総合スコア2241

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

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

NishidaRyu416_

2017/04/05 10:15

認証はうまくいって、ログインまで出来るのですが、idが、何故か付与されませんません。
moke

2017/04/05 10:23

Oauth認証で、ふらっと立ち寄る人も多いだろうし、一々ユーザーに登録する必要ないよねー。ってことで、デフォルトではユーザーが作成されません、。リンク先のページのように自主的にユーザーを作成して登録してください。
NishidaRyu416_

2017/04/05 10:52

はい。 app/models/user.rb class User < ActiveRecord::Base # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable,:omniauthable has_many :words has_many :groups has_many :tests has_many :following_relationships, class_name: "Relationship", foreign_key: "follower_id", dependent: :destroy has_many :following_users, through: :following_relationships, source: :followed has_many :followed_relationships, class_name: "Relationship", foreign_key: "followed_id", dependent: :destroy has_many :followed_users, through: :followed_relationships, source: :follower has_many :favorites, dependent: :destroy has_many :favorite_users, through: :favorites, source: :word has_many :tests, dependent: :destroy has_many :tests_users, through: :favorites, source: :word has_many :relation_groups,dependent: :destroy has_many :relation_users,through: :relation_groups,source: :word # 他のユーザーをフォローする def follow(other_user) following_relationships.find_or_create_by(followed_id: other_user.id) end # フォローしているユーザーをアンフォローする def unfollow(other_user) following_relationship = following_relationships.find_by(followed_id: other_user.id) following_relationship.destroy if following_relationship end # あるユーザーをフォローしているかどうか? def following?(other_user) following_users.include?(other_user) end def self.find_for_facebook_oauth(auth, signed_in_resource=nil) user = User.where(:provider => auth.provider, :uid => auth.uid).first unless user user = User.create(name: auth.extra.raw_info.name, provider: auth.provider, uid: auth.uid, email: auth.info.email, password: Devise.friendly_token[0,20] ) end user end def self.find_for_twitter_oauth(auth, signed_in_resource=nil) user = User.where(:provider => auth.provider, :uid => auth.uid).first unless user user = User.create(name: auth.info.nickname, provider: auth.provider, uid: auth.uid, email: User.create_unique_email, password: Devise.friendly_token[0,20] ) end user end # 通常サインアップ時のuid用、Twitter OAuth認証時のemail用にuuidな文字列を生成 def self.create_unique_string SecureRandom.uuid end # twitterではemailを取得できないので、適当に一意のemailを生成 def self.create_unique_email User.create_unique_string + "@example.com" end end こんな感じで、ユーザーをいちいち作成しているので、idが、何故付与されないのか、疑問に思っているのです。
moke

2017/04/05 12:15

それを最初に書きましょうよ では、users.idのAI(オートインクリメント)が無効になっているのでは?
NishidaRyu416_

2017/04/05 16:53

本当に不思議で、emailアドレス元にUserを作成したところidに2が付与されていて、きちんとページにアクセスできました。しかし、Oauth認証で作られた方にはなぜかきちんとアクセスできません。 どのような理由が考えられますか?
NishidaRyu416_

2017/04/05 16:57

なぜか,twitterだとうまくいきます. facebookだとhttp://localhost:3000/#_=_というURLが帰ってくるのでこれが原因かもしれません
moke

2017/04/06 00:55

やはり気になるのがidが付与されないという点です、データベース上にはidの無いデータが登録されているのですか? そんなわけなくてcreateが失敗しているのですよね。 createをcreate!に変更してエラーコードを書くか 一番怪しい auth.extra.raw_info.nameを一旦削って登録してみて下さい あと、余談ですが create_unique_string等はインスタンスメソッドで良いのでは?
NishidaRyu416_

2017/04/06 03:47

idが付与されてました User.find(1) User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 1]] => #<User id: 1, email: "786721651482495-facebook@example.com", created_at: "2017-04-04 14:30:25", updated_at: "2017-04-06 03:45:17", uid: "786721651482495", provider: "facebook", name: nil, location: nil, profile: nil>
NishidaRyu416_

2017/04/06 05:36

しかし、何故か、showアクションを利用できません。何故でしょう?
moke

2017/04/06 08:11

だからshowを描画した時のエラーメッセージを見せて下さいよ
moke

2017/04/07 01:09

auth.extra.raw_info.name が原因であっていたみたいですね。 facebookのauth構造が変わっているのかもしれません。 あとはご自分で調べてみてください。 問題の切り分けができて良かったですね。
NishidaRyu416_

2017/04/07 07:25

はい。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問