You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:45:29