将使用Carrierwave_Direct上传的文件与对象相关联

时间:2013-01-17 18:47:17

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

我正在使用carrierwave_direct gem将文件直接上传到S3,一切顺利。但是,当亚马逊重定向回success_action_redirect中指定的网址时,我并未将上传的文件与该对象相关联。

我的控制器看起来像

def edit
  @excel_version = ExcelVersion.find(params[:id])
  @uploader = @excel_version.excel_everest_macro
  @uploader.success_action_redirect = edit_admin_excel_version_url
end


def update
  @excel_version = ExcelVersion.find(params[:id])
  @excel_version.assign_attributes(params[:excel_version])
  @excel_version.save
end

我的视图中有一个隐藏的表单字段,看起来像     = form_for @excel_version do | form |       = form.hidden_​​field:key

因此,在我的更新操作中,我只使用@excel_version.assign_attributes(params[:excel_version]) 亚马逊返回的密钥使其成为模型就好了。但是,安装在@excel_version对象上的上传器没有获取url,我无法设置链接然后下载该文件。

关于我如何使用S3参数的任何建议都会返回给我,以便将文件与模型关联起来作为载波通常会做什么?

谢谢!

P.S。另一个答案在这里建议阅读github上的carrier_wave直接文档,我已经发现并且在这方面没有帮助。

2 个答案:

答案 0 :(得分:0)

要将图像与模型相关联,您可以在控制器中创建一个方法,该方法将使用亚马逊的参数并创建图像链接

例如,您可以 -

  def image_url
    respond_to do |format|
      format.json { render :json => { :filelink => "https://s3.amazonaws.com/#{params[:bucket]}/#{params[:key]}" } }
    end
  end

此代码将做的是当amazon成功重定向到image_url方法时,它将使用参数“bucket”和“key”来创建与图像的精确链接。 (发送的参数同时具有密钥和桶名称)

现在,您可以将此图片网址放在视图中的隐藏对象中,这样当表单发布到服务器时,网址也会随之发布。您可以将其与模型相关联。

希望这会有所帮助。它对我有用。

答案 1 :(得分:0)

所以我的问题是我在错误的表单上有hidden_field :key字段。我错误地将字段放在将文件上传到S3的direct_upload_form_for @uploader表单上。

当然,在将文件发布到S3后,用户返回到的表单上需要:key字段(即传递给success_action_redirect的网址方法)。在那里,S3将返回参数中的密钥,您可以将其与模型相关联。

感谢所有有用的建议!