2013-09-24 15 views
5

我已经搜索过所有的答案,所以我确信这并没有问过。请帮助我,救世主!Rails:s3_direct_upload - 如何保存/使用数据响应?

我想用s3_direct_upload gem来直接上传文件到S3,但我不知道如何看到/使用/保存显然是从S3服务器返回的数据。我读过s3_direct_upload的README十几次,它给出了一些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,以及等于用户输入的文本的:name: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的问题看来,他们已经知道如何使用它(问题只是较小的细节)。所以我迷路了,因为我甚至无法让它开始工作。我对网络前端有点新,所以请耐心等待并向我解释。非常感谢!

回答

3

我还是不明白什么callback_url真的是,

callback_url是,它会发布到通过AJAX宝石完上传文件到S3之后的路径。所以work_path(@work)应该没问题。

$( '#myS3Uploader')绑定 “s3_upload_complete”,(即内容) - >
$( '#someHiddenField')VAL(content.url)

但我没有想法在哪里把这一点的代码。

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

而且下面的代码粘贴在同一个文件的CoffeeScript

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

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

如果你没有看到提交文件后,任何两个人,然后有一些其他的问题。我强烈建议使用firebug。这对调试客户端JavaScript函数非常有帮助。在Firebug网络面板中,您可以看到该宝石是否正在拨打s3服务器电话。它还会在控制台面板中显示任何javascript错误。

+0

感谢您的快速反应。我看到文件放入文件后根本没有上传文件。什么可能会阻止文件上传? – Tsubaki

+0

在输入上述代码后是否会收到任何提醒?如果没有看到萤火虫控制台的错误。 – tihom

+0

我意识到,表单代码应该有“S3-上传”作为ID而不是类。现在文件上传正常,但我没有收到任何警报。这很奇怪。 (我会在哪里看到的警报?) – Tsubaki