我正在使用来自master分支和PostgreSQL的多个文件上传 我的产品模型有一个名为“images”的字符串字段,我可以很好地附加多个图像。
虽然我无法弄清楚,如何从产品中删除一张图片? 我可以删除所有图片,如文档中所述:
product.remove_images!
product.save
但没有找到如何删除单张图片的方法。
答案 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还负责删除文件。