ruby 无方法错误:未定义true的方法'username':TrueClass

hiz5n14c  于 2023-03-08  发布在  Ruby
关注(0)|答案(2)|浏览(127)

环境

  • Ruby [2.6.6]
  • 轨道**[4.2.8]**
  • 设计**[4.7.3]**

当前行为

大家好,我面临的问题,而用户已经签署,我的应用程序成功执行动作,基本上是回调后登录和路由到搜索页面。基本上我正在使用一个名为:requires_auth_token的before_action已在我的所有控制器(即搜索,消息,购物车等)使用。
和上面的动作方法被存储在我的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**
在我看来,这是因为这一行:-www.example.comhttps://github.com/heartcombo/devise/blob/400eaf7fbe05f50b48c08dc7dbf23259cbdb8bdb/lib/devise/controllers/sign_in_out.rb#L51
因为它返回布尔值true并存储在self.current_user中。这里有人能解释一下为什么这是不同的行为是这个问题与典狱长?

预期行为

此处预期行为是返回用户活动记录对象,而不是真值。

先谢谢你的帮助。

lnlaulya

lnlaulya1#

扩展@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
hivapdat

hivapdat2#

问题可能在这里:

self.current_user = sign_in(:user, self.current_user_token.user)

sign_in方法返回一个布尔值,因此您要将self.current_user设置为布尔值(在本例中为TrueClass),而不是User对象(或您使用的任何用户类)。

相关问题