每个上传者更改cloudinary文件默认网址

时间:2015-04-01 16:30:21

标签: ruby-on-rails ruby-on-rails-4 cloudinary

我有一个Rails 4应用Ruby 2.2.0

我正在构建一个应用程序,我需要存储相当多的图像。目前该应用程序存在并在本地服务器上管理其图像,但我们想要更改它。

该应用目前部署在Heroku上,我们希望使用Cloudinary服务上传(使用carrierwave)新图片以及存储现有图片。

问题来自于我似乎无法采用平台正在使用的当前文件夹结构。首先,我通过cloudinary仪表板中的媒体管理器上传了我的所有文件。我创建了两个文件夹headerlogo。在这种情况下,我将引用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>

目前,正在传递的网址如下:http://res.cloudinary.com/hxwmb9swy/image/upload/5a444a7c191e8c98999f6d0c2d3afaf9_Arendsen_Machinefabriek.jpg但是我需要有header(我在Cloudinary中创建的文件夹)文件夹,所以网址应该看起来像这样:http://res.cloudinary.com/hxwmb9swy/image/upload/header/5a444a7c191e8c98999f6d0c2d3afaf9_Arendsen_Machinefabriek.jpg

当然,就徽标而言,它完全相同,而不是header它应该说logo。这也适用于其他型号。所以我的问题是如何以某种方式管理它,以便我可以按uploader指定此文件夹?欢迎任何想法。

2 个答案:

答案 0 :(得分:2)

headerlogo应包含在图片的公开ID中。因此,如果您执行服务器端上载,则可以覆盖上传器中的public_id方法以包含该文件夹。例如,以下内容将公共ID设置为header文件夹,其中包含原始图像的文件名(没有扩展名,应该如此):

def public_id
    basename = File.basename(original_filename, File.extname(original_filename))
    "header/#{basename}"
end

如果您使用Cloudinary&#39; cl_image_upload进行客户端上传,则可以执行以下操作:

<%= f.cl_image_upload(:image, :folder => "header") %>

对于第二种情况,您无需更改上传器中的任何内容。

答案 1 :(得分:0)

使用CarrierWave创建自定义名称文件夹Cloudinary

include Cloudinary::CarrierWave

def public_id
 return "my_folder/" + Cloudinary::Utils.random_public_id;
end