diff --git a/src/rails.js b/src/rails.js index 6f89f251..bddeddd8 100644 --- a/src/rails.js +++ b/src/rails.js @@ -117,11 +117,11 @@ method = element.data('method'); url = element.data('url'); data = element.serialize(); - if (element.data('params')) data = data + "&" + element.data('params'); + if (element.data('params')) data = data + "&" + element.data('params'); } else { method = element.data('method'); url = element.attr('href'); - data = element.data('params') || null; + data = element.data('params') || null; } options = { @@ -276,7 +276,7 @@ rails.handleRemote(link); return false; - }); + }); $(rails.formSubmitSelector).live('submit.rails', function(e) { var form = $(this), @@ -309,7 +309,8 @@ }); $(rails.formInputClickSelector).live('click.rails', function(event) { - var button = $(this); + var button = $(this), + remote = form.data('remote') !== undefined; if (!rails.allowAction(button)) return rails.stopEverything(event); @@ -317,7 +318,13 @@ var name = button.attr('name'), data = name ? {name:name, value:button.val()} : null; - button.closest('form').data('ujs:submit-button', data); + var form = button.closest('form'); + form.data('ujs:submit-button', data); + + if(remote) { + rails.handleRemote(form); + return false; + } }); $(rails.formSubmitSelector).live('ajax:beforeSend.rails', function(event) { diff --git a/test/public/test/data-remote.js b/test/public/test/data-remote.js index 61cde2f7..4b5b3bbe 100644 --- a/test/public/test/data-remote.js +++ b/test/public/test/data-remote.js @@ -13,18 +13,17 @@ module('data-remote', { method: 'post' })) .find('form').append($('')); - } }); asyncTest('clicking on a link with data-remote attribute', 5, function() { $('a[data-remote]') - .bind('ajax:success', function(e, data, status, xhr) { + .bind('ajax:success', function(e, data, status, xhr) { App.assert_callback_invoked('ajax:success'); App.assert_request_path(data, '/echo'); equal(data.params.data1, 'value1', 'ajax arguments should have key data1 with right value'); equal(data.params.data2, 'value2', 'ajax arguments should have key data2 with right value'); - App.assert_get_request(data); + App.assert_get_request(data); }) .bind('ajax:complete', function() { start() }) .trigger('click'); @@ -44,12 +43,12 @@ asyncTest('changing a select option with data-remote attribute', 5, function() { ); $('select[data-remote]') - .bind('ajax:success', function(e, data, status, xhr) { + .bind('ajax:success', function(e, data, status, xhr) { App.assert_callback_invoked('ajax:success'); App.assert_request_path(data, '/echo'); equal(data.params.user_data, 'optionValue2', 'ajax arguments should have key term with right value'); equal(data.params.data1, 'value1', 'ajax arguments should have key data1 with right value'); - App.assert_get_request(data); + App.assert_get_request(data); }) .bind('ajax:complete', function() { start() }) .val('optionValue2') @@ -58,16 +57,34 @@ asyncTest('changing a select option with data-remote attribute', 5, function() { asyncTest('submitting form with data-remote attribute', 4, function() { $('form[data-remote]') - .bind('ajax:success', function(e, data, status, xhr) { + .bind('ajax:success', function(e, data, status, xhr) { App.assert_callback_invoked('ajax:success'); App.assert_request_path(data, '/echo'); equal(data.params.user_name, 'john', 'ajax arguments should have key user_name with right value'); - App.assert_post_request(data); + App.assert_post_request(data); }) .bind('ajax:complete', function() { start() }) .trigger('submit'); }); +asyncTest('submitting form with data-remote submit button', 4, function() { + $('form') + .data('remote', false) + .append( + $('', { + 'data-remote': true, + id: "remote-submit" + }) + .bind('ajax:success', function(e, data, status, xhr) { + App.assert_callback_invoked('ajax:success'); + App.assert_request_path(data, '/echo'); + equal(data.params.user_name, 'john', 'ajax arguments should have key user_name with right value'); + App.assert_post_request(data); + }) + .bind('ajax:complete', function() { start() }) + .trigger('submit#remote-submit'); +}); + asyncTest('form\'s submit bindings in browsers that don\'t support submit bubbling', 4, function() { var form = $('form[data-remote]'), directBindingCalled = false;