我正在使用AJAX而不是http来提交表单。 这是形式:
<%= form_for(:image, :remote => true, :url => {:controller=> 'questions',:action => 'upload'},:multipart => true) do |f| %>
<%= f.file_field :image, :onchange => "$(this).parents('form').submit();" %>
<% end %>
我在上面设置了:remote => true
选项并提交了一个onchange
事件的表单。我在控制器中有以下代码:
def upload
if request.xhr?
@image = Image.new(params[:image])
@image.save
respond_to do |format|
format.js { render :layout=>false }
end
else
render :text => 'Request Wasnt AJAX'
end
end
我的操作每次都会呈现文本,尽管设置了远程标记,但请求似乎不是AJAX样式(即使在最终的HTML中它也能正确显示)。我无法弄清楚我在哪里出错了。我已经在最新的FF和Chrome浏览器版本中对其进行了测试,因此我认为这不是浏览器问题。有什么想法吗?
更新:我做了一些调试尝试。问题在于文件字段,如果我用文本字段替换文件字段,请求是AJAX(其他一切保持相同)。但是对于文件字段,它总是发送非AJAX请求。
注意:总体目标是通过AJAX请求上传图像,响应不呈现任何内容,没有HTML,没有重定向,也没有重新加载页面。
答案 0 :(得分:3)
通过安装Remotipart gem来实现它。要使用ajax表单提交上传图像文件,这是唯一的方法。在这里找到git:https://github.com/JangoSteve/remotipart
答案 1 :(得分:1)
JQuery form.submit()以正常方式(Not Ajax)提交表单。你必须以不同的方式做到这一点:
$('#submitButton').click( function() {
$.ajax({
url: 'some-url',
type: 'post',
dataType: 'json',
data: $('#myForm').serialize(),
success: function(data) {
// ... do something with the data...
}
});
});