如何在 Rails 4 中调试自定义设计策略?

How to Debug Custom Devise Strategy in Rails 4?

我有 LDAP authentication strategy 的 Devise 示例的修改版本。它不工作,我正在尝试做一些 Rails 日志记录来弄清楚,但日志记录本身似乎也没有工作。

我从 logger.debug 'Debug Info' 开始。然后尝试了Rails.logger.debug 'Debug Info'。我什至尝试过老式的 puts 'Debug Info'。 None 个将显示在控制台中。

这是我config/initializers/ldap_authenticatable.rb

的相关部分
module Devise
  module Strategies
    class LdapAuthenticatable < Authenticatable
      def authenticate!
        Rails.logger.debug '=== Starting LDAP Authentication ==='
        fail(:invalid_login) unless params[:user]
        ldap.auth find_dn, password
        Rails.logger.debug ldap.auth

        if ldap.bind
          Rails.logger.debug '=== LDAP Authorized! ==='
          user = User.find_or_create_by(email: email)
          success!(user)
        else
          Rails.logger.debug '=== LDAP Failed Auth! ==='
          fail(:invalid_login)
        end
      end
...

我已将策略添加到 config/initializers/devise.rb

Devise.setup do |config|
  config.warden do |manager|
    manager.default_strategies(scope: :user).unshift :ldap_authenticatable
  end
...

我根据需要修改了我的User.rb

class User < ActiveRecord::Base
  devise :ldap_authenticatable, :rememberable, :trackable
...

这是我的 Rails 日志

Started POST "/users/sign_in" for 127.0.0.1 at 2015-02-11 18:38:16 -0800
Processing by Devise::SessionsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"Cv62THOWW4A/pGeflwrVlWSrABg0kY1UyJGBUoQz/B8daAs/9vMLhe1XTKmIbLWR3G6XXoRbvQ6Wis5GKVQiKA==", "user"=>{"email"=>"[REDACTED]", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Sign in"}
  User Load (0.4ms)  SELECT  "users".* FROM "users" WHERE "users"."email" =   ORDER BY "users"."id" ASC LIMIT 1  [["email", "[REDACTED]"]]
Completed 401 Unauthorized in 20ms
Processing by Devise::SessionsController#new as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"Cv62THOWW4A/pGeflwrVlWSrABg0kY1UyJGBUoQz/B8daAs/9vMLhe1XTKmIbLWR3G6XXoRbvQ6Wis5GKVQiKA==", "user"=>{"email"=>"[REDACTED]", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Sign in"}
  Rendered devise/sessions/new.html.erb within layouts/application (18.9ms)
  Rendered layouts/_navigation_links.html.erb (0.2ms)
  Rendered layouts/_navigation.html.erb (0.9ms)
  Rendered layouts/_messages.html.erb (0.1ms)
Completed 200 OK in 150ms (Views: 149.0ms | ActiveRecord: 0.0ms)

那么如何将一些值打印到控制台?还是我漏掉了什么?

如果 logger.debug "LDAP Authorized!" 没有出现,则可能是因为您的执行路径没有命中这部分代码。要确认您的代码正在执行,请尝试在其部分路径中引发异常。

调试控制器比尝试筛选 Rails 日志更容易引发异常,并且有助于立即确认代码的某些部分是否正在执行。要添加异常,请尝试向控制器流的某些部分添加一行代码,例如 raise ldap.inspect,以查看该部分代码是否为 运行。

调试时,在此代码路径中的任何实例变量上调用 .inspect 也会有所帮助,它会为您提供有关对象临时状态的信息,让您深入了解事情为何无法正常工作。