环境
- 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/