I've got a model creation form in rails which I also have returning JSON through ajax. My code so far look like:
$('#new_stem').ajaxForm({ //#new_stem is my form
dataType: 'json',
success: formSuccess
});
function formSuccess(stemObj) {
//does stuff with stemObj
}
And I have a multipart form with a file uploader (but I'm not sure if that is relevant).
When I submit the form it works fine (my models are properly being created and renders as json), but instead of the json getting handled by the formSuccess function, it prompts a download for "stems.json" (the path to my stem creation action) in Firefox.
What would cause this to happen, and what could solve it? Not sure if this is part of the problem, but I don't have a submit button in my form, I have a link with a click handler that calls $('#new_stem).submit()
Thanks guys!
EDIT: Firebug tells me the header contains the following:
Etag "b53e5247e7719cf6b1840e2c6e68781c"
Connection Keep-Alive
Content-Type application/json; charset=utf-8
Date Mon, 03 May 2010 02:19:31 GMT
Server WEBrick/1.3.1 (Ruby/1.8.7/2010-01-10)
X-Runtime 241570
Content-Length 265
Cache-Control private, max-age=0, must-revalidate
plus a cookie header
To prevent browser to trigger download of .json file set Content-type header to "text/html".
PHP:
header("Content-type: text/html");
ASP.NET MVC:
return Json(obj, "text/html");
In javascript you need to parse text result, like this:
$(".addform").ajaxSubmit({
url: "file.php",
type: "POST",
dataType: "text",
iframe: true,
success: function (text) {
var data = $.parseJSON(text);
},
error: function (xmlRequest, textStatus, errorThrown) {
alert(errorThrown);
}
});
Works perfectly.
Though not exactly what I was aiming to solve, I was able to come to a slightly different solution that suited my needs!
As ajax file uploads are done through iframes, the issue was that after the iframe loaded the .json file, it was interpreted by Firefox as a download and a download prompt was opened. I am pretty sure I could have played with some server settings to prevent this, but I've already sunk enough time into this.
So what I did was rendered the output as text instead of json because I was only really fishing for one id number anyway. My code now looks like:
$(document).ready(function() {
$('#continue-upload').click(function() {
$('#new_stem').ajaxSubmit({
dataType: 'text', //'json',
success: formSuccess
});
});
});
The id number I needed also came wrapped in pre tags, so I needed to strip those off in my results function as well.
This does what I want it to now, woo!
Actually the ajaxSubmit code for that plugin is slightly hacky. To make ajaxSubmit work (at time of writing) your server must return JSON data as content-type=text/html. The plugin will automatically pull off the <\pre> tags etc (see source). I guess when they were trying to get the hidden iframe to pull json back they decided to treat json a text and parse it off the iframe.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With