在 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
。
如果附件有其他名称,请相应地更新每个 upload
和 uploads
。
编辑
迁移文件需要有一个特定的名称:
20150417125122_change_upload_to_paperclip.rb
(日期字符串是自动生成的,我从下面的评论中复制了这个。)
这是因为 Rails 只会在中间有下划线的情况下查找 ChangeUploadToPaperclip
。
如果您有 changeuploadtopaperclip.rb
,它将查找 Changeuploadtopaperclip
。
运行特殊迁移
rake db:migrate:up VERSION=20150417125122
目前我尝试用回形针替换 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
。
如果附件有其他名称,请相应地更新每个 upload
和 uploads
。
编辑 迁移文件需要有一个特定的名称:
20150417125122_change_upload_to_paperclip.rb
(日期字符串是自动生成的,我从下面的评论中复制了这个。)
这是因为 Rails 只会在中间有下划线的情况下查找 ChangeUploadToPaperclip
。
如果您有 changeuploadtopaperclip.rb
,它将查找 Changeuploadtopaperclip
。
运行特殊迁移
rake db:migrate:up VERSION=20150417125122