使用activity_notification gem遇ActiveRecord::RecordNotFound错误求助
解决activity_notification gem与friendly_id集成时的用户查找问题
我之前也碰到过一模一样的问题,activity_notification gem默认是用数值ID去查找用户的,但当你集成了friendly_id之后,请求里传的user_id变成了slug字符串(比如你这里的dannytom222),gem的默认查找逻辑直接用find(params[:user_id])自然就找不到用户,所以才会抛出“Couldn't find User”的错误。
你提到堆栈只显示def find_b...,这其实是gem里find_target方法的截断显示,这个方法就是用来查找目标用户的核心逻辑,我们只需要重写它就能解决问题,具体步骤如下:
1. 重写gem的用户查找方法
因为你用了gem预定义的控制器,我们可以在自己的项目里创建一个继承自gem控制器的自定义控制器,覆盖它的查找方法:
# app/controllers/notifications_controller.rb class NotificationsController < ActivityNotification::NotificationsController private # 重写查找目标用户的方法,改用friendly_id的查找逻辑 def find_target # 根据你User模型里friendly_id的配置,用friendly.find或者find_by_slug @target = User.friendly.find(params[:user_id]) end end
2. 更新路由指向自定义控制器
接下来需要修改路由,让activity_notification的请求路由到我们自己的控制器上:
# config/routes.rb # 如果你用gem的路由助手,可以直接指定控制器 activity_notification_routes controller: 'notifications' # 或者手动定义路由(二选一即可) resources :notifications, controller: 'notifications' do collection do post :mark_as_read_all post :mark_as_unread_all end member do post :mark_as_read post :mark_as_unread end end
3. 确认User模型的friendly_id配置
确保你的User模型已经正确设置了friendly_id,比如:
# app/models/user.rb class User < ApplicationRecord extend FriendlyId # 这里的:username替换成你用来生成slug的字段,比如:email或者其他自定义字段 friendly_id :username, use: :slugged end
这样修改之后,gem就会用slug去查找用户,而不是默认的数值ID,就能解决找不到用户的问题了。
内容的提问来源于stack exchange,提问作者Johnny C
相关产品推荐
相关产品推荐

