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

Rails环境下CKEditor上传至S3后无法在编辑器访问问题

解决CKEditor+CarrierWave+S3上传后界面冻结的问题

从你的错误日志和代码细节来看,核心问题是你的Ckeditor::Picture模型调用了url(:content)方法,但对应的CkeditorPictureUploader并没有定义名为content的图片版本,这直接触发了ArgumentError (Version content doesn't exist!)错误,导致CKEditor无法完成上传后的回调逻辑,最终界面冻结。

具体修复方案

方案一:给上传器添加content版本(推荐)

CKEditor的图片上传组件默认期望获取一个用于预览的图片版本,你可以在上传器里定义这个版本,还能顺便做尺寸优化:

class CkeditorPictureUploader < CarrierWave::Uploader::Base
  include Ckeditor::Backend::CarrierWave  
  include CarrierWave::MiniMagick

  storage :fog

  # 添加content版本的定义,尺寸可按需调整
  version :content do
    process resize_to_limit: [800, 800]
  end

  def store_dir
    "uploads/ckeditor/pictures/#{model.id}"
  end

  def default_url
    "/images/fallback/" + [version_name, "default.png"].compact.join('_')
  end

  def content_type_blacklist
    ['application/text', 'application/json']
  end

  def extension_white_list
    Ckeditor.image_file_types
  end
end

方案二:修改模型方法,跳过版本调用

如果不需要生成图片版本,也可以直接修改Ckeditor::Picture的方法,让它返回原始图片的URL:

class Ckeditor::Picture < Ckeditor::Asset
  mount_uploader :data, CkeditorPictureUploader, mount_on: :data_file_name

  def url_content
    url # 去掉(:content)参数,直接返回原始图片地址
  end
end

问题根源说明

你提到直接用CarrierWave+S3上传封面图正常,是因为那个流程不需要调用url(:content)这个CKEditor专属的方法;而CKEditor上传图片时,会主动调用url_content来获取预览图地址,由于你的上传器没有对应版本,就抛出了错误,中断了CKEditor的上传流程,最终导致界面冻结。

内容的提问来源于stack exchange,提问作者user8773096

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:17:46