21241


ruby 2.2.2p95  
Rails 4.2.5  
mac yosemite

* * *

deviseでtwitterログインの機能を実装しております。

以下のページを参考にTwitter認証時はパスワードを要求しないようにpassword_required?というメソッドを作りました。  
<http://qiita.com/cigalecigales/items/a98be8416bf169ce5942>

ただ、twitterの認証は成功するものの、いつもパスワードの入力欄が表示されており困っております。

binding.pryで確認したところtrueになっているのが原因かと思います。

```  
[1] pry(#)> super  
=> true

[8] pry(#)> super.class  
=> TrueClass  
```

しかし、このsuperが何をしているのかが、今の私の知識量ではわからず、  
deviseのソースコードを読んでみたり、ググッてもわからなかったため質問させて頂きました。

宜しくお願いします。

※twitter連携機能自体は実装されており、上手く連携されております。  
連携時はパスワード欄を隠したいというところだけが上手く行ってません。


CC BY-SA 3.0
2016-01-23T14:52:17.443
21237
2016-01-24T13:44:29.500
13175
question
ruby-on-rails ruby rubygems devise
deviseでtwitterログイン機能を実装するにあたりpassword_required?のメソッドで躓いてます。


Qiitaに載っているコードは以下のようになっています。

[code]

    class User < ActiveRecord::Base
        # (省略)...
        def password_required?
            super && provider.blank?
        end
    end
    
[/code]

`password_required?`メソッドの実装はおそらく、

  * 親クラスのルールにおいてパスワード入力が必須（super）
  * かつ（&&）、providerが未指定（provider.blank?）
  * であれば、パスワード入力を必須とする

という意味だと思います。

> このsuperが何をしているのかが、今の私の知識量ではわからず

superは親クラスの同名メソッド（つまりpassword_required?）を呼びだしています。  
具体的にはDeviseの中で実装されているメソッドです。

<https://github.com/plataformatec/devise/blob/master/lib/devise/models/validatable.rb#L50>

[code]

      # Checks whether a password is needed or not. For validations only.
      # Passwords are always required if it's a new record, or if the password
      # or confirmation are being set somewhere.
      def password_required?
        !persisted? || !password.nil? || !password_confirmation.nil?
      end
    
[/code]

コメントにもあるとおり、

  * モデルがDBにまだ保存されていない
  * または、パスワードか確認用パスワードがセットされている

状態であればパスワード入力が必須になります。

> twitterの認証は成功するものの、いつもパスワードの入力欄が表示されており困っております。  
>  binding.pryで確認したところ（superが）trueになっているのが原因かと思います。

初回ログイン時は「モデルがDBにまだ保存されていない」状態なので super は必ずtrueになります。（つまり原因ではない）  
原因は「providerが未指定」になっている方だと思います。

フォームを表示する前に、Userモデルのproviderに "twitter" のような値をセットすれば provider.blank? は false
になり、結果として password_required? も false になるはずです。

ただ、Qiitaの記事にはどのタイミングでどんなコードを使ってproviderをセットするのか書かれていないので、自分で考えて実装する必要がありますね。


CC BY-SA 3.0
2016-01-23T23:03:29.563
21241
2016-01-23T23:03:29.563
85
21237
answer


Qiita の記事には下記のように記載があります。

> Userのproviderがカラの場合のみPassword入力を要求する。

よって、単にコードの転記ミスであり、実際は、逆ではないのでしょうか？

[code]

    def password_required?
      provider.blank? && super
    end
    
[/code]

他の記事を見ても、super は後に来ているように思います。

[validation - Rails3 devise / omniauth - password_required? and form_for
:validate => true don't work together - Stack
Overflow](https://stackoverflow.com/questions/9846480/rails3-devise-omniauth-
password-required-and-form-for-validate-true-don)

[code]

    def password_required?
      (authentications.empty? || !password.blank?) && super
    end
    
[/code]


CC BY-SA 3.0
2016-01-24T13:44:29.500
21266
2016-01-24T13:44:29.500
2017-05-23T12:38:56.083
-1
7471
21237
answer