我在包含一些文件字段的大屁股窗体上使用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 response_to块将其视为普通的html请求。此外,Firebug会显示解析器错误,并且无法在控制台中显示请求和响应标头。
如果删除文件字段并仅发布文本字段,则response_to块将请求作为js请求处理,并正确执行create.js.erb文件。
如何让Rails正确响应请求?谢谢。
最佳答案
由于JavaScript的安全性限制,无法通过XHR
发送带有(非空)文件字段的表单。
通常的解决方法是通过发布到隐藏的iframe来“伪造” ajax表单提交。我相信这也是jQuery Form插件的功能。
使Rails将这些“伪” ajax表单提交视为实际的XHR
请求的一种方法是在jQuery Form插件的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_to
方法现在应该可以按预期工作。