2014-02-20 2 views
1

Я использую best_in_place для обновления имен фотографий, которые я создал с помощью paperclip. Имя файла обновляется в базе данных, но фактически сохраненный файл (/ public/system/photos/attachments/...) не обновляется, чтобы отобразить измененное имя.Почему файлы не обновляются? (Rails4)

В результате приложение ищет новое имя файла, который не существует:

нет маршрута матчей [GET] «/ система/фотографии/вложения/000/000/011/оригинал/new_file_name. JPG»

Фото контроллер:

def update 
    @photo = Photo.find(params[:id]) 
    respond_to do |format| 
     if @photo.update_attributes(photo_params) 
     format.html { redirect_to(new_photo_path, :notice => 'Photo was successfully updated.') } 
     format.json { respond_with_bip(@photo) } 
     else 
     format.html { render :action => "edit" } 
     format.json { respond_with_bip(@photo) } 
     end 
    end 
    end 

Фото (новый) вид:

<% @photos.each do |photo| %> 
    <%= best_in_place photo, :attachment_file_name, :type => :input %> 
<% end %> 

ответ

3

best_in_place дает вам механизм для указания нового имени ваших вложений, тогда как Paperclip используется для загрузки new attachment или replacing with нового приложения. В вашем действии update вы передаете новый attachment_file_name, который будет только обновлять имя файла вложения в базе данных, но не физическое имя файла. Для этого вам нужно будет переименовать файл с помощью утилиты File.rename.

Например:

def update 
    @photo = Photo.find(params[:id]) 
    original_file_path = @photo.attachment.path 
    folder_path = original_file_path.gsub(@photo.attachment_file_name,"") 

    respond_to do |format| 
     if @photo.update_attributes(photo_params) 
     unless @photo.attachment.path == original_file_path 
      File.rename(original_file_path, folder_path + @photo.attachment_file_name) 
     end 
     format.html { redirect_to(new_photo_path, :notice => 'Photo was successfully updated.') } 
     format.json { respond_with_bip(@photo) } 
     else 
     format.html { render :action => "edit" } 
     format.json { respond_with_bip(@photo) } 
     end 
    end 
    end 

Надеется, что это решает проблему.

+0

почти .. я пробовал свой код, но я думаю, что он отсутствовал после File.rename. Я попытался отредактировать ваш ответ, но не могу, потому что это меньше шести символов. Может быть, вы могли бы попробовать? Тогда я могу отметить ваш вопрос как принятый. – Sheldon

+1

@ Шелдон 'end' не пропущен для' if'. Я выровнял код так, чтобы вы могли сопоставлять блоки. –

+0

@ KirtiThorat Спасибо за прекрасное обходное решение – HackerKarma

Смежные вопросы