ruby-on-rails - 无方法错误 : undefined method `username' for true:TrueClass

标签 ruby-on-rails ruby devise

环境

  • ruby [2.6.6]
  • rails [4.2.8]
  • 设计[4.7.3]

当前行为

大家好, 当用户已经签名并且我的应用程序成功执行操作时,我遇到问题,这些操作基本上是登录和路由到搜索页面后的回调。 基本上我使用的是名为 :requires_auth_token 的 before_action,它已在我的所有 Controller (即搜索、消息、购物车等)中使用。

在操作方法存储在我的base_controller中之前,下面是相同的代码片段。

def requires_auth_token
    authenticate_or_request_with_http_token do |token, options|
      self.current_user_token = UserToken.find_by(
        token: token,
        installation_identifier: options[:installation_identifier]
      )
      self.installation_identifier = options[:installation_identifier]
      if session[:utoken].blank?
        user = self.current_user_token.try(:user)
        if user.present? && user.active?
          self.current_user = sign_in(:user, self.current_user_token.user)
          session[:utoken] = token
        end
      else
        if self.current_user_token
          if self.current_user_token.current_token_valid?(@org)
            self.current_user = self.current_user_token.user
          else
            sign_out(:user)
            self.current_user_token.destroy
            session[:utoken] = nil
          end
        end
      end
      set_user_context
      self.current_user.present? ? self.current_user : false
    end
  end

因此,我的代码在 :set_user_context 处中断,因为我正在使用 HoneyBadger(用于跟踪错误(如果有)的应用程序)来检查我的应用程序在生产时的错误。

下面是:set_user_context的代码:

def set_user_context
    Honeybadger.context(
      username: current_user.username,
      user_email: current_user.email, 
      user_id: current_user.id, 
    )  if current_user
  end

所以这给了我错误 NoMethodError: undefined method username for true:TrueClass

在我看来,这是因为这一行:- https://github.com/heartcombo/devise/blob/400eaf7fbe05f50b48c08dc7dbf23259cbdb8bdb/lib/devise/controllers/sign_in_out.rb#L51

因为它返回 bool true值并存储在self.current_user中。 有人可以解释一下为什么这种行为不同,这是典狱长的问题吗?

预期行为

这里的预期行为是返回用户事件记录对象而不是真实值。

预先感谢您的帮助。

最佳答案

扩展@jeffdill2提供的答案和您的理解。
是的,方法 sign_in(:user, self.current_user_token.user) 返回 true 并且您将其分配给 self.current_user,因此您期望在用户对象上使用的任何方法都不起作用。

您可以更新如下逻辑并检查是否有帮助:

      if session[:utoken].blank?
        user = self.current_user_token.try(:user)
        if user.present? && user.active? && sign_in(:user, user)
          self.current_user = user
          session[:utoken] = token
        end
      else
        # [...More logic]
      end

关于ruby-on-rails - 无方法错误 : undefined method `username' for true:TrueClass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75616188/

相关文章:

ruby-on-rails - 使用 rspec 测试 Rails STI 子类

ruby-on-rails - Heroku 上生产中的 Rails 5 应用程序正在使用 GET 方法调用注销

ruby-on-rails - 如何调试 Rails 中的 Trace/BPT Trap 错误?

ruby-on-rails - 设计多个模型和多个登录表单

ruby-on-rails - Devise Ruby on Rails 中的 build_resource 和 resource 是什么?

java to rails - 去过那里吗?

ruby-on-rails - 在 heroku 上激活 resque worker

ruby-on-rails - 如何覆盖 'Email has already been taken' ?

css - 使用 CSS 属性从 Sprite 裁剪 Logo

sql - 不同的加入 Rails