jQuery表单插件+ Ajax文件上传+ Rails

时间:2009-11-16 08:05:17

标签: jquery ruby-on-rails ajax file upload

我在包含一些文件字段的大屁股表单上使用jQuery Form Plugin。后端是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

js看起来像:

$("#listing_form").ajaxForm({ dataType: 'script' });

我也宣布:

jQuery.ajaxSetup({ 
    'beforeSend': function(xhr) {xhr.setRequestHeader('Accept', 'text/javascript')}
});

请求进入控制器,但Rails的respond_to块将其视为普通的html请求。此外,Firebug显示解析器错误,无法在控制台中显示请求和响应标头。

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

如何让Rails正确回复请求?感谢。

2 个答案:

答案 0 :(得分:4)

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

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

// ...
beforeSubmit: function(data) {
    data.push({name: 'accept_js', value: '1'});
}
// ...

然后在你的控制器中使用一个前置过滤器,当发布的数据包含特殊参数时,将请求的格式设置为:js

before_filter :set_ajax_request

# ...

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

您的respond_to方法现在应按预期工作。

答案 1 :(得分:2)

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

http://rubygems.org/gems/remotipart

http://github.com/leppert/remotipart