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
相关产品推荐
相关产品推荐

