ruby-on-rails-4 - 从 Rails 3 升级到 Rails 4 后,CarrierWave url nil
问题描述
在将我们的应用程序从 Rails 3.2.22 升级到 Rails 4.2.11 时,升级之前有效的几个 CarrierWave 方法现在返回 nil,例如.url
和.file
。我们将资产托管在 AWS S3 上,我们的应用程序托管在 Heroku 上。奇怪的是,图像在我们的开发环境中按预期工作。
CarrierWave 1.3.1 (upgraded from 0.11.2)
Rails 4.2.11, upgraded from 3.2.22
Ruby 2.2.5
fog-aws 3.3.0
到目前为止,我已经尝试更改载波配置,并在 rails 控制台中使用不同的方法,并将开发结果与生产结果进行比较。
Gemfile
source 'https://rubygems.org'
ruby '2.2.5'
gem 'rails', '4.2.11'
gem 'puma'
gem 'pg', '0.15.1'
gem 'jquery-rails'
gem 'jquery-ui-rails'
gem 'rack-cors'
gem 'sprockets_uglifier_with_source_maps'
gem 'carrierwave'
gem 'mini_magick', '3.6.0'
gem 'paper_trail', '>= 4.0'
gem 'fog-aws'
gem 'aws-sdk-s3', '~> 1'
gem 'identity_cache', '>= 0.2'
gem 'memcachier'
gem 'dalli'
gem 'connection_pool'
gem 'active_model_serializers', '>= 0.10'
gem 'formtastic', '~> 3.1.0'
gem 'sprockets-rails', require: 'sprockets/railtie'
gem 'sprockets-image_compressor'
gem 'actionpack-action_caching'
gem 'sass-rails', '5.0.6'
gem 'uglifier', '2.5.0'
gem 'compass-rails'
gem 'sprite-factory', '1.5.3'
gem 'responders', '~> 2.0'
group :development do
gem 'rack-mini-profiler'
gem 'rmagick', '2.13.2'
end
carrierwave.rb
CarrierWave.configure do |config|
config.fog_provider = 'fog/aws'
config.fog_credentials = {
provider: ENV['FOG_PROVIDER'],
aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'],
aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
region: ENV['FOG_REGION'],
endpoint: ENV['FOG_HOST']
}
if Rails.env.production?
config.storage = :fog
config.fog_directory = ENV['FOG_DIRECTORY']
config.fog_public = false
config.fog_authenticated_url_expiration = 1800
else
config.asset_host = "#{ENV['FOG_HOST']}"
config.storage = :file
config.enable_processing = false if Rails.env.test?
end
end
art_uploader.rb
# encoding: utf-8
class ArtUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
version :thumbnail do
process resize_to_fill: [100, 100]
end
# Override the directory where uploaded files will be stored.
# This is a sensible default for uploaders that are meant to be mounted:
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
# Add a white list of extensions which are allowed to be uploaded.
def extension_white_list
%w(jpg jpeg png)
end
# Provide a default URL as a default if there hasn't been a file uploaded:
def default_url
if model.has_fallback_art?
version_name == :thumbnail
model.song.artist.photo.small_thumb.url :
model.song.artist.photo.album_art.url
end
end
end
我希望能够在我输入时从 S3 返回资产路径
art.url
在开发中我得到art.url => "https://qa-marmosetmusic-com.s3.amazonaws.com/uploads/artist/photo/173/af2ac015-1d44-4481-b5d6-5bf5cb8c0e23.jpg"
但是在生产中art.url => nil
。
当我进入art
开发控制台时,它返回这个对象:
=> #<ArtUploader::Uploader70128841541160:0x007f904c7c88f8
@cache_id=nil,
@file=
#<CarrierWave::SanitizedFile:0x007f904c1ffd68
@content=nil,
@content_type=nil,
@file=
"/Users/ekingan/dev/marmoset/public/uploads/album/art/3540/thumbnail_Evan_Andree_Your_Heart_Album_Artwork_1_3000x3000.jpg",
@original_filename=nil>,
@filename=nil,
@format=nil,
@model=
#<Album:0x007f904a0417a8
id: 3540,
title: "Your Heart",
art: "Evan_Andree_Your_Heart_Album_Artwork_1_3000x3000.jpg",
state: "active",
description: "",
created_at: Tue, 27 Nov 2018 12:50:14 PST -08:00,
updated_at: Tue, 27 Nov 2018 12:50:14 PST -08:00>,
@mounted_as=:art,
@parent_version=
#<ArtUploader:0x007f904c7c9618
@cache_id=nil,
@file=
#<CarrierWave::SanitizedFile:0x007f904c7c8948
@content=nil,
@content_type=nil,
@file="/Users/ekingan/dev/marmoset/public/uploads/album/art/3540/Evan_Andree_Your_Heart_Album_Artwork_1_3000x3000.jpg",
@original_filename=nil>,
@filename=nil,
@format=nil,
@model=
#<Album:0x007f904a0417a8
id: 3540,
title: "Your Heart",
art: "Evan_Andree_Your_Heart_Album_Artwork_1_3000x3000.jpg",
state: "active",
description: "",
created_at: Tue, 27 Nov 2018 12:50:14 PST -08:00,
updated_at: Tue, 27 Nov 2018 12:50:14 PST -08:00>,
@mounted_as=:art,
@storage=#<CarrierWave::Storage::File:0x007f904c7c9118 @cache_called=nil, @uploader=#<ArtUploader:0x007f904c7c9618 ...>>,
@versions={:thumbnail=>#<ArtUploader::Uploader70128841541160:0x007f904c7c88f8 ...>}>,
@storage=
#<CarrierWave::Storage::File:0x007f904c7c86f0
@cache_called=nil,
@uploader=#<ArtUploader::Uploader70128841541160:0x007f904c7c88f8 ...>>,
@versions={}>
当我在生产中输入相同的内容时,它会返回:
#<ArtUploader::Uploader6168740:0x000000072781c8 @model=#<Album id: 2008, title: "Vektlaus", art: "Daniel+Kvammen+-+Vektlaus.jpg", state: "active", description: nil, created_at: "2017-05-19 18:40:43", updated_at: "2017-07-26 16:51:17">, @mounted_as=:art, @file=nil, @filename=nil, @cache_id=nil, @versions={}, @format=nil, @parent_version=#<ArtUploader:0x00000007278d30 @model=#<Album id: 2008, title: "Vektlaus", art: "Daniel+Kvammen+-+Vektlaus.jpg", state: "active", description: nil, created_at: "2017-05-19 18:40:43", updated_at: "2017-07-26 16:51:17">, @mounted_as=:art, @file=nil, @filename=nil, @cache_id=nil, @versions={:thumbnail=>#<ArtUploader::Uploader6168740:0x000000072781c8 ...>}, @format=nil, @storage=#<CarrierWave::Storage::Fog:0x000000072786f0 @uploader=#<ArtUploader:0x00000007278d30 ...>>>, @storage=#<CarrierWave::Storage::Fog:0x00000007267300 @uploader=#<ArtUploader::Uploader6168740:0x000000072781c8 ...>>>
我很想听听任何建议。谢谢!
解决方案
我们解决了这个问题!
我们在carrierwave/storage 中有一个名为fog.rb 的文件,它覆盖了gem 行为并导致了这个问题。删除该文件允许一切按预期工作。
推荐阅读
- caching - 是否可以禁用特定地址范围的缓存
- ssis - SSIS - 如何使用包部署模型从子包中设置父变量值
- ruby-on-rails - 进入新行时,Actiontext Editor 中的图像会闪烁或刷新
- node.js - 使用 nodeJs 从 AWS SQS 队列获取待处理消息计数
- typescript - 根据函数参数推断回调参数类型
- javascript - 如何在 jQuery ajax 中使用 GET 请求发送原始数据?
- c# - 带有定时器方法的接口事件
- ansible - Ansible:使用模式复制多个文件以分隔多个目标
- javascript - 我的连接闪存在 registerProcess 中工作,但在 showForm 中给我空数组这是什么问题?
- vue.js - 在我的 Vue 项目中使用 v-for 没有得到任何输出