【问题标题】:Associating a file uploaded with Carrierwave_Direct with an object将使用 Carrierwave_Direct 上传的文件与对象相关联
【发布时间】:2013-01-01 09:36:43
【问题描述】:

我正在使用carrierwave_direct gem 将文件直接上传到S3,一切都很顺利。但是,当亚马逊重定向回success_action_redirect 中指定的 URL 时,我没有将上传的文件与对象关联。

我的控制器看起来像

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 做 |form| = form.hidden_​​field :key

所以在我的更新操作中我只使用@excel_version.assign_attributes(params[:excel_version]) 亚马逊返回的密钥使其进入模型就好了。但是,安装在 @excel_version 对象上的上传程序没有获取 url,我无法设置链接来下载文件。

关于如何使用返回给我的 S3 参数将文件与模型关联起来的任何建议,就像carrierwave 通常会做的那样?

谢谢!

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

【问题讨论】:

  • 你能提供更多关于返回的 :key 值的信息吗?您是否成功将键值保存到@excel_version?如果是这样,那么为什么您在下载时遇到问题?如果你有密钥,那么你应该有正确的 URL 链接到上传的文件...更多信息也许我可以提供帮助

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


【解决方案1】:

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

例如你可以这样做-

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

此代码的作用是,当亚马逊成功重定向到 image_url 方法时,它将使用参数“bucket”和“key”来创建指向您的图像的精确链接。 (发送的参数有key和bucket名称)

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

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

【讨论】:

  • 感谢分享。您能否展示您如何完成最后一步:将“文件链接”分配给表单中的隐藏字段?
【解决方案2】:

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

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

感谢所有有用的建议!

【讨论】:

    猜你喜欢
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    相关资源
    最近更新 更多