在“新”操作中使用模型ID直接上传S3?

时间:2015-11-29 23:44:16

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

我目前正在使用jQuery文件上传直接上传到我的rails应用中的S3。

我有一个pm_report,里面有3张照片,我正在上传它们,对现有报告没有任何问题。

当我尝试创建新报告时出现问题,因为它在将报告保存到数据库之前尝试建立要上传的照片的路径(它还没有ID)。

我有什么

pm_reports_controller.rb

...
before_action :set_s3_direct_post, only: [:new, :edit, :create, :update]
...
private
...
  def set_s3_direct_post
      @s3_direct_post = S3_BUCKET.presigned_post(key: "pm_reports/#{@pm_report.id}/${filename}", success_action_status: '201', acl: 'private')
  end

我想要完成的事情:将报告的3个图像保存在S3上的pm_reports内的自己的文件夹中。

有没有办法可以针对此问题实施解决方法,或者采用不同的方法?

1 个答案:

答案 0 :(得分:0)

编辑:找到更好的解决方案。

逻辑就是这样。

为您的应用创建第二个存储桶,将规则设置为在x天内自动删除。 使用jQuery文件直接上传到S3临时存储桶。 然后在模型中添加after_commit回调,以便您可以使用aws-sdk gem将对象从一个存储桶复制到另一个存储桶,从而将临时上载路径更改为它的最终路径。

这让我为对象添加一个固定名称,因为它适合我的问题,因此,在进行回调之后,我设置了最终路径,然后将其显示在视图上的image_tag上。

如果有人问我,请详细说明并提供一些代码。

我使用了一种uuid作为布伦特在评论中指出的不同方法。

我不得不改变一些事情:

添加迁移

class AddUuidToPmReports < ActiveRecord::Migration
   def change
     add_column :pm_reports, :uuid, :uuid
   end
end

更改 pm_reports_controller.rb ,以便在&#39; new&#39;之后设置s3直接帖子。行动和“编辑”之前行动。另外,更改预先签名的帖子的键以使用uuid并将其作为强参数接受。

...
before_action :set_s3_direct_post, only: :edit
...
def new
    @pm_report = PmReport.new
    @pm_report.uuid = SecureRandom.uuid
    set_s3_direct_post
end
...
private
...
def pm_report_params
      params.require(:pm_report).permit( ..., :uuid)
    end

  def set_s3_direct_post
      @s3_direct_post = S3_BUCKET.presigned_post(key: "pm_reports/#{@pm_report.uuid}/${filename}", success_action_status: '201', acl: 'private')
  end

最后,为表单传递的uuid添加一个隐藏字段,以便我们保存它。

查看/ pm_reports / _form.html.erb

<%= form_for @pm_report, ... %>
...
<%= f.hidden_field(:uuid) %>
...
<%= f.submit %>