Rails中访问Active Admin Campaign详情页触发RecordNotFound问题
解决Active Admin中Campaign详情页的ActiveRecord::RecordNotFound问题(关联friendly_id)
核心原因
Active Admin默认用find(params[:id])查找资源,但你的模型依赖friendly_id用slug作为标识符,默认查找逻辑没适配friendly_id的规则,导致无法通过slug定位到对应记录。
解决方案
1. 让Active Admin适配friendly_id的查找逻辑
在app/admin/campaigns.rb中重载控制器的资源查找方法,替换默认逻辑:
ActiveAdmin.register Campaign do # 保留原有配置... controller do def find_resource # 使用friendly_id的专用查找方法匹配slug(含历史slug) scoped_collection.friendly.find(params[:id]) end end # 保留原有配置... end
2. 删除自定义的first_by_friendly_id方法
你的Campaign模型中自定义的这个方法会干扰friendly_id原生逻辑:
# 删掉这段代码 def self.first_by_friendly_id(id) super(id.split("-").map(&:capitalize).join("-")) end
friendly_id本身已实现完整的slug查找(包括你配置的:history模块),自定义方法强制修改传入的id格式,反而可能导致和数据库中存储的slug不匹配。
3. 从允许参数中移除slug
slug字段由friendly_id自动维护,不需要手动允许该参数,避免手动修改导致数据不一致:
# 修改permit_params,移除:slug permit_params :title, :description, :appeal_id, :user_id
额外检查点
- 确认
campaigns表存在slug字段,且已有记录的slug值正常生成 - 访问详情页时的URL使用的是正确的slug格式(比如
/admin/campaigns/My-Campaign,而非主键id)
内容的提问来源于stack exchange,提问作者Fuaad
相关产品推荐
相关产品推荐

