Загрузка файлов Rails (paperclip) при редактировании
Я сделал себе простое приложение для блогов типа rails, в котором я использую Paperclip для загрузки файлов изображений. У меня все нормально работает и денди. Я даже подключил его к ведерке S3 и т.д. Spiffy правильно?
Но я не могу понять, что делать, когда РЕДАКТИРОВАТЬ/ОБНОВИТЬ сообщение. Как сейчас стоит, все, что у меня есть, это поле в моем шаблоне формы:
= f.file_field :image
Итак, скажем, "post/5/edit", даже если есть ранее прикрепленное изображение, в поле отображается "No file selected".
Хуже того, нет явного способа очистить текущий образ, если я передумаю и не хочу прикреплять изображение.
Как сделать это немного более удобным для пользователя и убедиться, что текущее изображение - текст /url в порядке - отображается как значение в текстовом поле и/или пользователь может изменить текущий образ на none.
Ответы
Ответ 1
Для Rails3 здесь то, что я делаю. К сожалению, я еще не использовал Rails4.
Чтобы отобразить пользователю, если они уже загрузили файл, сделайте это в своем представлении:
<% if @blog.image.exists? %>
<%= image_tag @blog.image.url(:thumb) %><br/>
<% end %>
<%= f.file_field :image %>
Затем, чтобы позволить пользователю удалить текущую загрузку, добавьте это в свой вид (внутри этого блока):
<%= 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
Таким образом, если пользователь установит флажок, он очистит изображение при следующем сохранении.
Ответ 2
Этот метод не работал у меня с несколькими полями.
Я использую javascript для этого, поскольку я также использую кокон для динамического добавления нескольких изображений, в форме редактирования я показываю все изображения со своими собственными кнопками удаления. Затем я подсчитываю количество объектов изображения и скрываю то же количество полей для загрузки файлов изображений. В настоящее время я настроен на несколько, но с небольшим изменением он может работать для вашего дела. После удаления они перенаправляются туда, где в вашем случае счетчик будет равен 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 ваши результаты тогда выглядят так...
![введите описание изображения здесь]()