环境
- 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
中。这里有人能解释一下为什么这是不同的行为是这个问题与典狱长?
预期行为
此处预期行为是返回用户活动记录对象,而不是真值。
先谢谢你的帮助。
2条答案
按热度按时间lnlaulya1#
扩展@jeffdill2提供的答案和您的理解。
是的,方法
sign_in(:user, self.current_user_token.user)
返回true
,而您将其赋值给self.current_user
,因此您希望在用户对象上使用的任何方法都将无法工作。您可以按如下所示更新逻辑,并检查是否有帮助:
hivapdat2#
问题可能在这里:
sign_in
方法返回一个布尔值,因此您要将self.current_user
设置为布尔值(在本例中为TrueClass
),而不是User
对象(或您使用的任何用户类)。