Rails:s3_direct_upload - 如何保存/使用数据响应?

Tsu*_*aki 5 ajax jquery ruby-on-rails amazon-s3 coffeescript

我已经搜遍了所有的SO以获得答案,所以我确信之前没有被问过.请帮助我,救世主啊!

我正在尝试使用s3_direct_upload gem来处理直接上传到S3的文件,但我只是不知道如何查看/使用/保存显然是从S3服务器返回的数据.我已经阅读了s3_direct_upload的README十几次了,它给出了JS代码的一些示例片段,但没有告诉我该代码应该去哪里.

我已经完成了README的第一部分,并设置了AWS配置和简单的jQuery

jQuery ->
  $("#s3-uploader").S3Uploader()
Run Code Online (Sandbox Code Playgroud)

在我的CoffeeScript中(正确包含在资产管道中).

在我看来,我有这个:

<%= s3_uploader_form callback_url: work_path, callback_param: "work[url]", class: "s3-uploader" do %>
    <%= file_field_tag :file, multiple: false %>
<% end %>

<%= form_for(@work) do |f| %>

    <%= f.label :name, "Title" %>
    <%= f.text_field :name %>
    <%= f.label :category, "Category" %>
    <%= f.text_field :category %>
    <br>
    <%= f.submit "Upload", id: "btn-upload-work", class: "btn btn-large btn-warning btn-upload" %>

<% end %>
Run Code Online (Sandbox Code Playgroud)

我希望用户上传work并填写一些字段.当用户单击该"Upload"按钮时,work应创建一个new ,其属性:url等于上载文件的url,以及与用户输入的文本相等的:name:category属性.然后页面应重定向到show提交的工作页面.README给出了这个例子:

$('#myS3Uploader').bind "s3_upload_complete", (e, content) ->
  $('#someHiddenField').val(content.url)
Run Code Online (Sandbox Code Playgroud)

但我不知道在哪里放这些代码.

这是我的控制器:(我知道create动作需要改变,但我不确切知道是什么.我已经实验了几个小时但respond_to没有用.)

def show
    @work = Work.find(params[:id])
end

def new
    @work = Work.new
end

def create
    @work = current_user.works.new(work_params)
    if @work.save
        flash[:success] = "Work successfully submitted!"
        redirect_to @work
    else
        render 'new'
    end
end

private

    def work_params
        params.require(:work).permit(:name, :category, :url)            
    end
Run Code Online (Sandbox Code Playgroud)

即使在阅读了README十几次之后,我仍然不明白究竟callback_url是什么callback_param,是什么,以及如何使用它们.更糟糕的是,加载此视图会产生错误--Rails不喜欢该callback_url: work_path部分.我不得不改变它以work_path(@work)使其加载,但我不确定这是否正确(因为我不明白callback_url).

从其他人询问的有关s3_direct_upload的问题来看,似乎他们已经知道如何使用它(问题只是较小的细节).所以我迷失了,因为我甚至无法让它在第一时间起作用.我对网络前端有点新意,所以请耐心跟我解释一下.非常感谢!

tih*_*hom 3

我还是不明白callback_url到底是什么,

callback_url是 gem 完成将文件上传到 s3 后通过 AJAX 发布的路径。所以work_path(@work)应该没问题。

$('#myS3Uploader').bind "s3_upload_complete", (e, content) ->
$('#someHiddenField').val(content.url)

但我不知道把这段代码放在哪里。

您可以将上述代码放置在您放置 .coffeescript 的同一个 CoffeeScript 文件中$("#s3-uploader").S3Uploader()$('#someHiddenField').val(content.url)用。。。来代替alert(content.url)。这样,如果上传成功,您将收到一条警报消息。

还将以下代码粘贴到同一个 CoffeeScript 文件中

$('#myS3Uploader').bind "s3_upload_failed", (e, content) ->
  alert("#{content.filename} failed to upload : #{content.error_thrown}")
Run Code Online (Sandbox Code Playgroud)

如果出现错误,上面的代码将显示警报。

如果提交文件后没有看到两者中的任何一个,则存在其他问题。我强烈推荐使用firebug。它对于调试客户端 JavaScript 函数非常有帮助。在 firebug net 面板中,您可以查看 gem 是否正在调用 s3 服务器。它还会在控制台面板中显示任何 JavaScript 错误。