5

我已经在整个 SO 中搜索了答案,所以我确定以前没有人问过这个问题。请帮助我,哦救世主!

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

我已经完成了自述文件的第一部分并设置了 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等于上传文件的 url,:nameand:category属性等于用户输入的文本。然后页面应该重定向到show提交作品的页面。自述文件给出了这个例子:

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

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

这是我的控制器:(我知道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

即使阅读了 README 十几遍,我仍然不明白什么是callback_url真正的内容,什么callback_param是,以及如何使用它们。更糟糕的是,加载这个视图会报错——Rails 不喜欢这个callback_url: work_path部分。我必须更改它才能work_path(@work)加载它,但我不确定这是否正确(因为我不明白callback_url)。

从其他人提出的关于 s3_direct_upload 的问题来看,他们似乎已经知道如何使用它(这些问题只是较小的细节)。所以我迷路了,因为我什至一开始就无法让它工作。我对网络前端有点陌生,所以请耐心等待并向我解释一下。非常感谢!

4

1 回答 1

3

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

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

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

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

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

还将以下代码粘贴到同一个咖啡脚本文件中

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

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

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

于 2013-09-24T11:09:47.220 回答