69203


devise gem の authenticate_user がなぜか正常なアカウントに対して 401 を出すようになったので  
ソースコードにデバッグを挟んでどこのどの値がおかしいのかしらべようとしたんですが  
devise のリポジトリ内でこのメソッドを検索しても定義場所が見当たりません

[authenticate_user!
の検索結果](https://github.com/heartcombo/devise/search?q=authenticate_user%21&unscoped_q=authenticate_user%21)

helper メソッドのようなので

[app/helpers/devise_helper.rb](https://github.com/heartcombo/devise/blob/master/app/helpers/devise_helper.rb)  
もみてみたんですがメソッドは見当たりません

[code]

    require 'devise'
    
    authenticate_user!
    
[/code]

と書いたときに呼ばれるコードはどうやって gem のリポジトリから探せばいいのでしょうか…

* * *

/usr/local/bundle/gems/devise-4.7.1/lib/devise/controllers/helpers.rb に

[code]

                def authenticate_#{group_name}!(favourite=nil, opts={})
                  unless #{group_name}_signed_in?
                    mappings = #{mappings}
                    mappings.unshift mappings.delete(favourite.to_sym) if favourite
                    mappings.each do |mapping|
                      opts[:scope] = mapping
                      warden.authenticate!(opts) if !devise_controller? || opts.delete(:force)
                    end
                  end
                end
    
                def #{group_name}_signed_in?
                  #{mappings}.any? do |mapping|
                    warden.authenticate?(scope: mapping)
                  end
                end
    
[/code]

というそれらしいコードを見つけたので

[code]

                def #{group_name}_signed_in?
                  puts '======================================='
                  puts mappings
                  #{mappings}.any? do |mapping|
                    puts mapping
                    puts warden.authenticate?(scope: mapping)
                    warden.authenticate?(scope: mapping)
                  end
                end
    
[/code]

とデバッグメッセージをみたのですが  
コントローラから user_signed_in? をよんで  
Rails を再起動し直して何も表示されません  
ここではないんでしょうか…


CC BY-SA 4.0
2020-08-03T06:32:18.547
69199
2020-08-03T08:41:32.043
2020-08-03T08:40:22.480
question
ruby-on-rails ruby rubygems devise
Gemfile 内のソースコードのメソッドの探し方について


以下のコマンドでgemのパスを探せます

[code]

    $ gem which devise
    
[/code]

Gemfileに`devise`のバージョンが書かれているはずなので、そのバージョンを参照してください。


CC BY-SA 4.0
2020-08-03T07:32:04.753
69200
2020-08-03T07:32:04.753
4715
69199
answer


おっしゃるとおり、`authenticate_user!`は動的に定義されているメソッドなので単にgrepしても見つけるのは難しいです。

動的に定義されているメソッドに限らないですが、メソッドの定義位置を探すのにはpry-railsが役に立ちます。  
<https://github.com/rweng/pry-rails>  
Gemfileにpry-
railsを追加した上で、適当なコントローラーのメソッドに`binding.pry`と書いてみてください。書くところは`authenticate_user!`メソッドが使えるところであればどこでもokです。

[code]

    # users_controller の new actionを書き換える例
    class UsersController < ApplicationController
      def new
        # ↓を追記
        binding.pry
      end
    end
    
[/code]

そうするとrails serverのプロセスがそこで停止してpryが起動して、デバッグを開始できます。

[code]

    [1] pry(#<UserController>)>
    
[/code]

ここで、`$ メソッド名` と入力すると、そのメソッドの定義位置が表示されます。  
`authenticate_user!`を入れると次のようになると思います。

[code]

    [1] pry(#<UserController>)> $ authenticate_user!
    From: /path/to/gems/devise-4.7.2/lib/devise/controllers/helpers.rb:116:
    Owner: Devise::Controllers::Helpers
    Visibility: public
    Signature: authenticate_user!(opts=?)
    Number of lines: 4
    
    def authenticate_#{mapping}!(opts={})
      opts[:scope] = :#{mapping}
      warden.authenticate!(opts) if !devise_controller? || opts.delete(:force)
    end
    
[/code]

これを見ると`/path/to/gems/devise-4.7.2/lib/devise/controllers/helpers.rb:116`で定義されていることが分かります。

<https://github.com/heartcombo/devise/blob/v4.7.2/lib/devise/controllers/helpers.rb#L116-L119>


CC BY-SA 4.0
2020-08-03T08:41:32.043
69203
2020-08-03T08:41:32.043
21283
69199
answer