我有一个由PDF文件组成的文档模型。因为我不需要以任何方式操纵PDF,所以我试图在没有处理步骤的情况下使用CarrierWaveDirect,我认为这是下载并重新上传文件。
我的上传器看起来像这样:
class DocumentUploader < CarrierWave::Uploader::Base
include CarrierWave::RMagick
include CarrierWave::MimeTypes
include CarrierWaveDirect::Uploader
def will_include_content_type
true
end
default_content_type 'application/pdf'
allowed_content_types = %w(application/pdf)
def store_dir
prefix = Rails.env.production? ? '' : 'tmp/'
"#{prefix}files/documents"
end
def extension_white_list
%w(pdf)
end
end
我将文档(在控制器中)定义为:
@document = Document.new.filename
@document.success_action_redirect = new_document_url(:step => 2)
我正在使用直接上传表单上传文件本身,这很正常。
<%= direct_upload_form_for @document do |f| %>
<%= f.file_field :filename, :required => true %>
<%= f.submit "Upload Document" %>
<% end %>
当我拿回密钥时,我创建了一个名为filename_key
的属性,我模型中的回调查找此属性以更新列。
控制器:
key = params[:key].split('/').last(2).join('/')
@document = Document.new(:filename_key => key)
型号:
after_save :check_for_file
def check_for_file
unless self.filename_key.blank?
update_columns(:filename => self.filename_key.to_s)
end
end
这实际上一切正常。问题是,当我再次保存记录时,我收到此错误:
ActiveRecord::StatementInvalid: Mysql2::Error: Data too long for column 'filename' at row 1: UPDATE `documents` SET `filename` = '--- &1 !ruby/object:DocumentUploader\nmodel: !ruby/object:Document\n attributes:\n id: 92\n ...
它正在尝试将属性的全部内容设置为属性本身。我的第一个猜测是我绕过了重要的after_create
或after_save
回调,但除非我避免这些回调,否则我无法在不进行处理的情况下保存文件。
任何有关下一步观看的建议都会提前感谢!
答案 0 :(得分:0)
我发现差不多一年前我有一个问similar question。事实证明,两者的解决方案都是一样的。
CarrierWaveDirect使用filename
作为一种方法(你猜对了!)使用上传文件的文件名。对我来说,将列名改为document
解决了我的问题。
我还应该注意到,我发现忽略处理步骤才能正常工作。但是,您确实会丢失在该步骤中调用的任何内容,例如,设置内容类型。正如我在问题中所示,我自动设置内容类型,这使我仍然可以在浏览器中查看PDF文件,因为它们设置为application/pdf
与{{1 }}