jQuery表单插件+;Ajax文件上传&x2B;轨道

jQuery表单插件+;Ajax文件上传&x2B;轨道,jquery,ruby-on-rails,ajax,file,upload,Jquery,Ruby On Rails,Ajax,File,Upload,我在一个包含一些文件字段的大表单上使用。后端是Ruby on Rails 我很难让Rails将POST请求类型识别为“text/javascript”,尽管我认为我的设置是正确的 该表单如下所示: <form id="listing_form" method="POST" enctype="multipart/form-data" action="/listings"> <input type="text" size="30" name="listing[venue][

我在一个包含一些文件字段的大表单上使用。后端是Ruby on Rails

我很难让Rails将POST请求类型识别为“text/javascript”,尽管我认为我的设置是正确的

该表单如下所示:

<form id="listing_form" method="POST" enctype="multipart/form-data" action="/listings">
    <input type="text" size="30" name="listing[venue][phone]" id="listing_venue_phone"/>
    <input type="file" size="30" name="listing[venue][image]" id="listing_venue_image"/>
    ...plus tons of other fields
$("#listing_form").ajaxForm({ dataType: 'script' });
我还宣布:

jQuery.ajaxSetup({ 
    'beforeSend': function(xhr) {xhr.setRequestHeader('Accept', 'text/javascript')}
});
请求发送给控制器,但Rails Response_to block将其视为普通html请求。此外,Firebug显示解析器错误,并且无法在控制台中显示请求和响应头

如果删除文件字段并仅发布文本字段,respond_to块将请求作为js请求处理,并正确执行create.js.erb文件


如何让Rails正确响应请求?谢谢。

由于JavaScript安全限制,无法通过
XHR
发送带有(非空)文件字段的表单。 通常的解决方法是通过发布到隐藏的iframe来“伪造”ajax表单提交。我相信这也是jQuery表单插件所做的

让Rails将这些“假”ajax表单提交视为实际的
XHR
请求的一种方法是在jQuery表单插件的
beforeSubmit
回调中添加一个特殊参数:

// ...
beforeSubmit: function(data) {
    data.push({name: 'accept_js', value: '1'});
}
// ...
然后在控制器中,当发布的数据包含特殊参数时,使用before过滤器将请求的格式设置为
:js

before_filter :set_ajax_request

# ...

private
  def set_ajax_request
    request.format = :js if params[:accept_js] == '1'
  end

您的
respond\u to
方法现在应该可以按预期工作。

如果您使用的是Rails 3,请尝试Remotipart gem。它使AJAX风格的文件上传相对轻松


jQuery表单插件的
dataType
选项是jQuery的
ajax
方法的
dataType
选项的代理。这意味着XHR需要一个文本/javascript内容类型的响应。这与发送的内容无关。谢谢您的回复。我得到的那部分,我编辑了我的帖子来澄清我的问题。嘿,谢谢你的建议。但是,accept_js参数在添加到beforeSubmit和点击Rails应用程序之间消失。这可能与iframe黑客有关。现在我正在追踪它……我跟踪了视频,并让它工作起来。基本上,我在表单中添加了一个插件,并安装了插件。工作完美。谢谢你的建议,它帮助我了解了正在发生的事情,让我走上了正确的方向。