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

时间:2013-09-24 10:47:56

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

我在SO上搜索了一个答案,所以我确信以前没有问过这个问题。请帮助我,救世主!

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

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

jQuery ->
  $("#s3-uploader").S3Uploader()

在我的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 %>

我希望用户上传work并填写一些字段。当用户点击"Upload"按钮时,应创建一个新的work,其中属性:url等于上传文件的网址,以及:name和{{ 1}}属性等于用户输入的文本。然后页面应重定向到提交的作品的:category页面。 README给出了这个例子:

show

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

这是我的控制器:(我知道$('#myS3Uploader').bind "s3_upload_complete", (e, content) -> $('#someHiddenField').val(content.url) 操作需要更改,但我不确切知道是什么。我已经用create进行了几个小时的实验而无济于事。)

respond_to

即使阅读了README十几次之后,我仍然不明白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 到底是什么,callback_url是什么,以及如何使用它们。更糟糕的是,加载此视图会出错--Rails不喜欢callback_param部分。我不得不将其更改为callback_url: work_path以加载它,但我不确定这是否正确(因为我不理解work_path(@work))。

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

1 个答案:

答案 0 :(得分:3)

  

我仍然不明白callback_url到底是什么,

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

  

$('#myS3Uploader')。bind“s3_upload_complete”,(e,content) - &gt;
  $('#someHiddenField')。val(content.url)

     

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

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

还将以下代码粘贴到相同的coffeescript文件

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

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

如果在提交文件后没有看到任何两个,那么还有一些其他问题。我强烈建议您使用firebug。它在调试客户端javascript函数时非常有用。在firebug网络面板中,您可以看到gem是否正在调用s3服务器。它还会在控制台面板中显示任何javascript错误。