我有一个带有Ruby 2.2.0
的Rails 4
应用程序。
我正在为需要存储大量图像的地方构建一个应用程序。目前,该应用程序已经存在,并且正在本地服务器上管理他们的图像,但我们想改变这一点。
该应用程序目前部署在Heroku上,我们希望使用Cloudinary
服务上传(使用carrierwave
)新图像以及存储现有图像。
这个问题是因为我似乎无法采用平台正在使用的当前文件夹结构。首先,我通过cloudinary仪表板中的媒体管理器上传了所有文件。我创建了两个文件夹header
和logo
。在这种情况下,我将以header
文件夹为例。
class BannerUploader < CarrierWave::Uploader::Base
include Cloudinary::CarrierWave
def store_dir
"uploads/header/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
end
型号:
class CompanyImage < ActiveRecord::Base
mount_uploader :file_name, BannerUploader
belongs_to :company
end
最后但同样重要的是,以下是我的观点:
<%
work_advantages = company.presentation.work_advantages
banner = company.company_images.where(header: true).first
%>
<%= link_to company do %>
<div class="card company-presentation-card card-hover">
<div class="card-container">
<div class="row">
<div class="col-md-12">
<div class="cover-image">
</div>
<h3><%= company.name %></h3>
<% company.company_sectors.each do |s| %>
<span class="h4-alt1 company-sector"><%= s.sector.name %></span>
<% end %>
<p><%= truncate(company.presentation.work_advantages, :length => 250) %> <span class="text-muted">(lees meer)</span></p>
</div>
</div>
</div>
</div>
<% end %>
<script>
//Set dynamic background image for the cover-image <div>
$(document).ready(function(){
$('.company-presentation-card').find('.cover-image').css('background-image', 'url("<%= banner.file_name %>")')
});
</script>
目前,正在交付的url如下:http://res.cloudinary.com/hxwmb9swy/image/upload/5a444a7c191e8c98999f6d0c2d3afaf9_Arendsen_Machinefabriek.jpg
但是我需要有header
(我在Cloudinary中创建的文件夹)文件夹,所以url实际上应该是这样的:http://res.cloudinary.com/hxwmb9swy/image/upload/header/5a444a7c191e8c98999f6d0c2d3afaf9_Arendsen_Machinefabriek.jpg
当然,在徽标的情况下,它完全相同,但应该说logo
而不是header
。这也适用于其他型号。所以我的问题是,我如何以某种方式管理它,以便我可以根据uploader
指定这个文件夹?欢迎提出任何想法。
header
或logo
应该包含在图像的公共ID中。因此,如果您在服务器端进行上传,您可以覆盖上传器中的public_id
方法以包含文件夹。例如,下面将公共ID设置为具有原始图像文件名的header
文件夹(不需要扩展名):
def public_id
basename = File.basename(original_filename, File.extname(original_filename))
"header/#{basename}"
end
如果您进行客户端上传,例如使用Cloudinary的cl_image_upload
,您可以执行以下操作:
<%= f.cl_image_upload(:image, :folder => "header") %>
对于第二种情况,无需更改上传程序中的任何内容。
使用CarrierWave 创建自定义名称文件夹Cloudinary
include Cloudinary::CarrierWave
def public_id
return "my_folder/" + Cloudinary::Utils.random_public_id;
end