编辑时Rails文件上传(回形针)

时间:2014-03-11 02:19:32

标签: ruby-on-rails ruby-on-rails-4 amazon-s3 paperclip

我自己制作了一个简单的rails blogging-type应用程序,我使用Paperclip上传图像文件。我的一切工作正常,花花公子。我甚至把它连接到一个S3斗,等等.Smiffy对吗?

但是在编辑/更新帖子时我无法想象该怎么做。按照现在的情况,我所拥有的只是表单模板上的这个字段:

= f.file_field :image

所以,即使有先前附加的图像,也可以说“post / 5 / edit”,该字段显示“未选择文件”。

更糟糕的是,如果我改变主意并且不想附加图像,则没有明显的方法来清除当前图像。

如何使这一点更加用户友好并确保当前图像 - 文本/网址正常 - 显示为文本字段中的值和/或用户可以将当前图像更改为无

2 个答案:

答案 0 :(得分:22)

对于Rails3,这就是我的工作。对不起,我还没有使用过Rails4。

要向用户显示他们是否已上传文件,请在您的视图中执行以下操作:

<% if @blog.image.exists? %>
  <%= image_tag @blog.image.url(:thumb) %><br/>
<% end %>
<%= f.file_field :image %>

然后,为了允许用户删除当前上传,请将其添加到您的视图中(在if块内):

<%= f.check_box :delete_image %>Delete Image<br/>

您在模型中处理该复选框:

  before_validation { image.clear if @delete_image }

  def delete_image
    @delete_image ||= false
  end

  def delete_image=(value)
    @delete_image  = !value.to_i.zero?
  end

这样,如果用户设置了复选框,它将在下次保存时清除图像。

答案 1 :(得分:0)

上述方法对我来说并不适用于多个领域。

我使用javascript来执行此操作,因为我还使用cocoon动态添加多个图像,在编辑表单上我使用自己的删除按钮显示所有图像。然后我计算图像对象的数量并隐藏相同数量的图像文件上传框。我目前将它设置为多个,但只需稍加改动就可以适用于您的情况。删除后,它们被重定向回到你的情况,计数将为0,它将显示上传框。

这是嵌套表单部分

<h3 class="text-muted">Upload Images</h3>
<% @rental.property_photos.each do |i| %>
    <div class="pic">
        <%= image_tag i.avatar.url(:thumb), class:"img-responsive property-images" %>
        <%= link_to i, method: :delete, data: { confirm: 'Are you sure?' } do %>
        <i class="fa fa-times-circle delete-pic"></i>
        <% end %>
    </div>
<% end %>
<fieldset id="property_photos">
    <%= f.fields_for :property_photos do |p| %>
    <%= render 'property_photo_fields', :f => p %>
    <% end %>
</fieldset>
<div class="links">
    <%= link_to_add_association 'Add Image', f, :property_photos, class:"fa fa-plus margin-bottom-20" %>
</div>

我的嵌套表格

<div class="nested_fields">
    <div class="col-md-3 picUploader">
         <%= f.file_field :avatar %>
    </div>
</div>

我的javascript

$(document).ready(function () {

     var count = $('.pic').length;

     function hideElements(x) {
         $('.picUploader').slice(0,x).hide();
     }

     hideElements(count);

})

用一点css你的结果然后看起来像这样...... enter image description here