Rails中CarrierWave存文件到public目录路径无法识别问题咨询
Rails 6.1 CarrierWave部署后上传资源404问题解决方案
你项目中配置的config.active_storage.service = :local属于ActiveStorage的配置项,与CarrierWave无关,不会影响CarrierWave的存储与链接生成逻辑。
方案a:配置CarrierWave存储到assets/images目录(不推荐)
注意:不推荐将动态上传的文件存放到assets目录下,该目录用于存放项目静态预编译资源,部署时执行assets:precompile会覆盖目录内动态写入的文件,且动态文件不会被纳入预编译逻辑,会引发更多访问异常。
如果坚持使用该方案,修改上传器的store_dir配置即可:
def store_dir "app/assets/images/archive/#{model.id}" end
存储后访问路径为/assets/archive/[model_id]/[文件名]。
方案b:修复public目录下资源可访问性(推荐)
部署后出现路由错误的核心原因是:CarrierWave默认存储根目录为public,你当前配置的store_dir会将文件实际存放在public/archive/路径下,但部署环境的静态资源服务没有将/archive开头的请求映射到对应目录。
按以下步骤配置即可修复:
- 第一步:明确配置CarrierWave的根存储路径,可在上传器文件或全局初始化文件中添加:
CarrierWave.configure do |config| config.root = Rails.root.join('public') end
- 第二步:开启静态文件服务
如果使用Rails自带的服务处理静态请求,在部署环境配置(如config/environments/production.rb)中添加:
如果使用Nginx部署,推荐直接在Nginx配置中添加规则,静态请求直接由Nginx处理无需走Rails链路:config.public_file_server.enabled = true # 可选:配置静态资源缓存头提升访问性能 config.public_file_server.headers = { 'Cache-Control' => "public, max-age=#{1.year.to_i}" }Nginx对应server块配置示例:
location /archive/ { root /你的项目部署路径/public; expires 1y; add_header Cache-Control public; } - 第三步:生成完整带域名的访问URL
如需生成带域名的完整URL,在部署环境配置中添加:# config/environments/production.rb config.action_mailer.default_url_options = { host: '你的正式域名', protocol: 'https' } # 同时配置CarrierWave的资源访问域名 CarrierWave.configure do |config| config.asset_host = 'https://你的正式域名' end
配置完成后调用attachment.image_url(:preview).to_s即可生成正常可访问的资源链接。
内容的提问来源于stack exchange,提问作者Jerome
相关产品推荐
相关产品推荐

