我正在使用best_in_place更新我使用paperclip创建的照片的名称。文件名正在数据库中更新,但实际存储的文件(/ public / system / photos / attachments / ...)未更新以反映更改的名称。
结果是应用程序在寻找不存在的新文件名:
没有路线匹配[GET]“/system/photos/attachments/000/000/011/original/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 %>
答案 0 :(得分: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
希望这可以解决您的问题。