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

Ruby 3.2.2升级后Rails Admin 3.1.2编辑带图项报undefined method `url'错误

Ruby 2.7.3 升级至3.2.2后 Rails Admin 编辑带图片对象报错解决

环境信息

  • Ruby:从2.7.3升级到3.2.2
  • Rails:6.1.7
  • 图片上传Gem:Shrine 3.4
  • 问题现象:Event模型创建操作正常,但打开编辑页面时触发报错

报错详情

报错位置

/home/zire/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/rails_admin-3.1.2/app/views/rails_admin/main/_form_file_upload.html.erb 第6行

错误信息

undefined method `url' for {:small=>#<StoryImageUploader::UploadedFile storage=:store id="403e525375510ed0575d905f52d58989.png" metadata={"filename"=>"image_processing20211129-7381-r1a05c.png", "size"=>16761, "mime_type"=>nil, "width"=>120, "height"=>59}>, :medium=>#<StoryImageUploader::UploadedFile storage=:store id="5a3b89da95d34693994a12baa71131a4.png" metadata={"filename"=>"image_processing20211129-7381-1158qla.png", "size"=>77113, "mime_type"=>nil, "width"=>360, "height"=>177}>, :featured=>#<StoryImageUploader::UploadedFile storage=:store id="0fec2d25a6662926126e123862245274.png" metadata={"filename"=>"image_processing20211129-7381-c97xn8.png", "size"=>463991, "mime_type"=>nil, "width"=>1140, "height"=>559}>}:Hash

触发错误的代码行

thumb && bindings[:object].public_send(:"#{name}", thumb).try(:url) || value.url

问题原因

Rails Admin的模板逻辑是:若指定了thumb参数,则调用对应尺寸的图片URL;否则直接调用value.url。但此处的value是Shrine生成的多尺寸图片Hash(每个key对应一个尺寸的UploadedFile对象),Hash没有url方法,因此触发报错。

解决方案

方案1:配置Rails Admin指定缩略图尺寸(推荐)

在config/initializers/rails_admin.rb中,针对Event模型的图片字段明确指定thumb参数,让Rails Admin调用对应尺寸的UploadedFile对象:

config.model 'Event' do
  edit do
    field :image do
      thumb :small # 可替换为业务中存在的其他尺寸,比如:medium或:featured
    end
  end
end

此配置会让代码优先执行bindings[:object].public_send(:"image", :small).try(:url),不会走到value.url的分支,避免Hash调用url的错误。

方案2:临时修改Rails Admin模板

直接修改报错的模板文件,增加对value类型的判断,若为Hash则取指定尺寸的图片URL:

thumb && bindings[:object].public_send(:"#{name}", thumb).try(:url) || (value.is_a?(Hash) ? value[:featured].try(:url) : value.try(:url))

注意:这种修改gem源码的方式在重新安装或更新gem后会失效,仅作为临时应急方案。

方案3:调整Shrine配置(谨慎使用)

若业务允许,可调整Shrine Uploader的配置,让图片字段返回单个UploadedFile对象而非多尺寸Hash,但这可能影响其他依赖多尺寸图片的业务逻辑,需全面评估后再修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 15:00:12