CarrierWaveDirect没有处理

时间:2014-09-07 12:57:07

标签: ruby-on-rails upload amazon-s3 carrierwave

我有一个由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_createafter_save回调,但除非我避免这些回调,否则我无法在不进行处理的情况下保存文件。

任何有关下一步观看的建议都会提前感谢!

1 个答案:

答案 0 :(得分:0)

我发现差不多一年前我有一个问similar question。事实证明,两者的解决方案都是一样的。

CarrierWaveDirect使用filename作为一种方法(你猜对了!)使用上传文件的文件名。对我来说,将列名改为document解决了我的问题。

我还应该注意到,我发现忽略处理步骤才能正常工作。但是,您确实会丢失在该步骤中调用的任何内容,例如,设置内容类型。正如我在问题中所示,我自动设置内容类型,这使我仍然可以在浏览器中查看PDF文件,因为它们设置为application/pdf与{{1 }}