Rails开发环境下无需判断环境优雅读取Assets文件的方法
问题:Rails开发环境下邮件嵌入图片的文件读取异常解决
我编写了如下代码用于在邮件中嵌入图片:
module EmailHelper def email_image_tag(image, **options) attachments.inline[image] = File.read(image_path(image)) image_tag attachments[image].url, **options end end
在生产环境中,由于图片资源已预编译,该代码能正确引用带哈希值的图片;但在开发环境中会抛出文件读取异常。请问是否存在无需判断Rails.env.development?的优雅方式来实现File.read操作?
解决方案
嘿,这个问题我之前也碰到过,其实不用手动判断环境,借助Rails本身的asset pipeline能力就能完美适配开发和生产环境:
修改后的代码如下:
module EmailHelper def email_image_tag(image, **options) # 让Rails自动查找对应环境下的资源文件 asset = Rails.application.assets.find_asset(image) # 直接获取资源的二进制内容,替代File.read attachments.inline[image] = asset.to_s image_tag attachments[image].url, **options end end
为什么这样可行?
Rails.application.assets.find_asset(image)会自动根据当前环境处理资源路径:- 在开发环境中,它会直接定位到
app/assets/images下的源图片文件; - 在生产环境中,它会找到预编译后带哈希值的静态资源文件。
- 在开发环境中,它会直接定位到
asset.to_s会直接返回资源的二进制内容,避免了手动使用File.read时可能出现的路径不匹配问题,完全不用关心环境差异。
如果你的项目是Rails 6+且使用Webpacker管理前端资源,也可以用Webpacker.manifest.lookup(image)来获取正确的资源路径,再读取内容,原理是类似的——让框架来处理环境适配,而不是自己写条件判断。
内容的提问来源于stack exchange,提问作者user1213904
相关产品推荐
相关产品推荐

