为什么文件没有更新? (Rails4)

时间:2014-02-20 20:19:34

标签: ruby-on-rails ruby-on-rails-4 paperclip best-in-place

我正在使用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 %>

1 个答案:

答案 0 :(得分:3)

best_in_place为您提供了为附件提供新名称的机制,而Paperclip则用于上传new attachmentreplacing 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

希望这可以解决您的问题。