我目前正在使用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内的自己的文件夹中。
有没有办法可以针对此问题实施解决方法,或者采用不同的方法?
答案 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 %>