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

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

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

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails

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

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

1回答

2323閲覧

【Rails】【activerecord】createが正しく実行されない場合がある

gogoackman3

総合スコア109

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails

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

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2016/12/16 07:18

deviseを利用して、twitterのouth認証を実装したのですが、なぜか、正しく認証→新規登録出来ないケースが発生します。

関連する、user.rbとomniouth_callback_controller.rbは以下の通りです。

omniauth_callbacks_controller.rb

ruby

1 def twitter 2 callback_from :twitter 3 end 4 5 def failure 6 flash[:alert] = "Twitterの認証に失敗しました" 7 redirect_to sessions_select_path 8 end 9 10 private 11 def callback_from(provider) 12 provider = provider.to_s 13 @user = User.find_for_oauth(request.env['omniauth.auth'].except("extra")) 14 if @user.persisted? 15 16 sign_in(:user, @user) 17 current_user.remember_me! 18 19 #ensure remember_user_token is set 20 cookies.signed["remember_user_token"] = { 21 :value => @user.class.serialize_into_cookie(@user.reload), 22 :expires => 3.months.from_now, 23 :domain => "0.0.0.0",} 24 redirect_to root_path 25 26 else 27 if provider == 'twitter' 28 session["devise.twitter_data"] = request.env["omniauth.auth"].except("extra") 29 flash[:alert] = "Twitter認証後にエラーが発生しました。もう一度お試しください。" 30 redirect_to sessions_select_path 31 end 32 end 33 end

▼user.rb

ruby

1 def self.find_for_oauth(auth) 2 user = User.without_soft_destroyed.where(uid: auth.uid, provider: auth.provider).first 3 4 unless user 5 user = User.create( 6 uid: auth.uid, 7 provider: auth.provider, 8 username: auth.info.name, 9 email: User.get_email(auth), 10 password: Devise.friendly_token[6, 30] 11 ) 12 end 13 14 p user 15 user 16 end 17 18 private 19 20 def self.get_email(auth) 21 email = auth.info.email 22 email = "#{Time.current.to_i.to_s}-#{auth.provider}-#{auth.uid}@example.com" if email.blank? 23 email 24 end

ログを見て調査したところ、user.rbのself.find_for_oauthの中で、User.createが正しく動いていないようでした。以下がそのCreateしたuserのuser変数に入っている値をpしたものです。

▼正常に新規登録出来た場合のログ(uidやusernameなど伏字)

#<User id: 3, active: true, email: "1481861405-twitter-***********@example.com", icon: "", created_at: "2016-12-16 04:10:05", updated_at: "2016-12-16 04:10:05", provider: "twitter", uid: "***********", username: "*********">

▼新規登録出来なかった場合のログ

#<User id: nil, active: true, email: "1481871154-twitter-***********@example.com", icon: "", created_at: nil, updated_at: nil, provider: "twitter", uid: "***********", username: "***********">

自動的にinsertされるはずの、idとcreated_at、updated_atがnilになっています。

同じコードなのですが、なぜかUserのcreateがうまくいかない時があるようです。

これはなぜなのでしょうか??

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

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

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

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

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

guest

回答1

0

自己解決

原因がわかったので、解決済みとします。

ruby

1password: Devise.friendly_token[6, 30]

これで生成されたパスワードが、場合によって、validationに引っかかっていたようでした。

ruby

1validates :password, format: { with: /\A[0-9a-z]+\z/i }

以下のような独自のメソッドを作成して対応しました。

ruby

1 def self.get_password(length=10) 2 numbers = [*0..9] 3 alpha_bigs = [*'A'..'Z'] 4 alpha_smalls = [*'a'..'z'] 5 codes = [numbers,alpha_bigs,alpha_smalls].shuffle 6 password = [] 7 length.times do |i| 8 password << codes[i % codes.length].sample(1) 9 end 10 password.shuffle.join 11 end

投稿2016/12/16 09:36

gogoackman3

総合スコア109

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問