在 rails 应用中使用回形针时出错

Errors while using paperclip in rails app

目前我尝试用回形针替换 attachment_fu 文件上传插件。

但是上传时出现一些错误:

我的控制器是这样的:

def create
add_breadcrumb 'breadcrumb.upload_file', {:action => :new}

puts "BLUBBBBBBBBBBBBBBBBBBBBBBBBBBB"
puts params[:upload]

    @upload = Upload.create(params[:upload])
    @upload.lecturer_id = current_user.id
    if @upload.save
        flash[:notice] = I18n.t("flash.saved")
        redirect_to :action => :index
    else
        render :action => :new
    end
end

我的模型是这样的:

puts has_attached_file :image, :default_url => :file_system
validates_attachment_content_type :image, :content_type => [:image, 'audio/mpeg', 'application/mp3', 'application/octet-stream']

上传时出现此错误:

ActiveRecord::UnknownAttributeError in UploadsController#create

unknown attribute: uploaded_data

app/controllers/uploads_controller.rb:24:in `create'

更新:

{"name"=>"TEST", "uploaded_data"=>#<ActionDispatch::Http::UploadedFile:0x00000005518a38 @original_filename="2014-09-26 18.14.22.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"upload[uploaded_data]\"; filename=\"2014-09-26 18.14.22.jpg\"\r\nContent-Type: image/jpeg\r\n", @tempfile=#<Tempfile:/tmp/RackMultipart20150415-12671-190wpi5>>}

更新:那不是我想要的。迁移在数据库中生成了一些新列,我如何return到以前的版本?有没有移民同伴?

您的图像列来自您的模型结构 image。但是参数中的数据图像正在进入 params[:model_name][uploaded_data]。 您的模型不包含名称为 uploaded_data 的任何列,对于 attached_file

在你的 form_for 你应该有这个

= f.file_field :image

没有

= f.file_field :uploaded_data

这样你的参数看起来像

{"name"=>"TEST", "image"=>#<ActionDispatch::Http::UploadedFile:0x00000005518a38 @original_filename="2014-09-26 18.14.22.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"upload[uploaded_data]\"; filename=\"2014-09-26 18.14.22.jpg\"\r\nContent-Type: image/jpeg\r\n", @tempfile=#<Tempfile:/tmp/RackMultipart20150415-12671-190wpi5>>}

它不会给你任何错误

在 github paperclip

上浏览 gem

您需要像这样创建迁移文件:

class AddAvatarColumnsToUsers < ActiveRecord::Migration
  def self.up
    add_attachment :model_name, :[image]
  end

  def self.down
    remove_attachment :model_name, :[image]
  end
end

或者使用生成器:

rails generate paperclip model_name [image]

要从 Paperclip 恢复迁移,您可以使用:

rake db:migrate:down VERSION=_current_migration_number

rake db:rollback

直到你以前的状态。然后你可以像这样创建一个新的迁移:

class ChangeUploadToPaperclip < ActiveRecord::Migration
  change do
    rename_column :uploads, :content_type, :upload_content_type 
    rename_column :uploads, :filename, :upload_filename
    rename_column :uploads, :size, :upload_file_size
    add_column :uploads, :upload_updated_at, :datetime
    # Warning: the following will remove your old data, irreversible.
    remove_column :uploads, :width 
    remove_column :uploads, :height 
    remove_column :uploads, :thumbnail 
  end
end

但是您的旧存储和 Paperclips 存储文件的方式之间可能存在潜在错误。

在这个回答中,我假设您的模型 has_attached_file :upload

如果附件有其他名称,请相应地更新每个 uploaduploads

编辑 迁移文件需要有一个特定的名称:

20150417125122_change_upload_to_paperclip.rb

(日期字符串是自动生成的,我从下面的评论中复制了这个。)

这是因为 Rails 只会在中间有下划线的情况下查找 ChangeUploadToPaperclip

如果您有 changeuploadtopaperclip.rb,它将查找 Changeuploadtopaperclip

运行特殊迁移

rake db:migrate:up VERSION=20150417125122