Carrierwave多图像上传

时间:2015-07-13 10:37:48

标签: ruby-on-rails carrierwave

我正在使用来自master分支和PostgreSQL的多个文件上传 我的产品模型有一个名为“images”的字符串字段,我可以很好地附加多个图像。

虽然我无法弄清楚,如何从产品中删除一张图片? 我可以删除所有图片,如文档中所述:

product.remove_images!
product.save

但没有找到如何删除单张图片的方法。

4 个答案:

答案 0 :(得分:3)

您是否考虑过使用嵌套表单来尝试删除图片?

以下是来自carrierwave github网站的一段代码......

<%= form_for @product, html: { multipart: true } do |f| %>
  .
  .
  .
    <label>
      <%= f.check_box :remove_images %>
      Remove images
    </label>
<% end %>

...我相信你已经看过了。当然,虽然调用remove_images!对你的情况不起作用,但这意味着对所有图像采取统一行动。

尝试以上修改,看看它是否有助于您对此问题进行排序并单独定位每个图像......

<%= nested_form_for @product, :html=>{ :multipart => true } do |f| %>
  .
  .
  .
  <%= f.fields_for :images do |product_form|  %>

    <%= product_form.link_to_remove "Remove this image" %>
  <% end %>
<% end %>

要完成这项工作,请务必在Gemfile中加入gem 'nested_form', '~> 0.3.2'

希望这可以帮助你。

答案 1 :(得分:1)

我从@Cris学习并在使用S3时使用以下代码片段。

def remove_image_at_index(index)
  remain_images = @product.images # copy the array
  deleted_image = remain_images.delete_at(index) # delete the target image
  deleted_image.try(:remove!) # delete image from S3
  @product.images = remain_images # re-assign back
end

我写了一篇关于此问题的blog post,并使用更具体的代码创建sample project

答案 2 :(得分:0)

您应该能够在指定的图像上使用<?xml version="1.0" encoding="UTF-8"?> <names> <name1> <key> firstname </key> <value> mememememe </value> <key> lastname </key> <value> mememememe </value> </name1> <name2> <key> firstname </key> <value> mememememe </value> <key> lastname </key> <value> mememememe </value> </name2> </names> Here's my code so far: NSString *filename = [documents stringByAppendingPathComponent:@"faves.plist"]; NSMutableDictionary *loadedMiscDictionary = [NSMutableDictionary dictionaryWithContentsOfFile:filename]; NSArray *directories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documents = [directories firstObject]; NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] init]; [tempDict setValue:firstNameString forKey:@"firstname"]; [tempDict setValue:secondNameString forKey:@"secondName"]; [loadedMiscDictionary addEntriesFromDictionary:tempDict]; [loadedMiscDictionary writeToFile:filename atomically:YES]; (来自数组)。因此,您需要先以某种方式识别图像(例如remove_image

答案 3 :(得分:0)

将类似的东西添加到产品模型中就可以了。

  def delete_image(idx)
    remaining_images = []
    self.images.each_with_index { |img,ii| remaining_images<<File.open(img.path) unless idx == ii}
    self.images=remaining_images
  end

保存记录后,Carrierwave还负责删除文件。