Skip to content

Commit 92af43f

Browse files
committed
data-method with params
1 parent dca8042 commit 92af43f

File tree

2 files changed

+53
-3
lines changed

2 files changed

+53
-3
lines changed

src/rails.js

+28-3
Original file line numberDiff line numberDiff line change
@@ -173,18 +173,43 @@
173173
var href = rails.href(link),
174174
method = link.data('method'),
175175
target = link.attr('target'),
176+
params = link.data('params'),
176177
csrfToken = $('meta[name=csrf-token]').attr('content'),
177178
csrfParam = $('meta[name=csrf-param]').attr('content'),
178179
form = $('<form method="post" action="' + href + '"></form>'),
179-
metadataInput = '<input name="_method" value="' + method + '" type="hidden" />';
180+
dataInputs = '<input name="_method" value="' + method + '" type="hidden" />';
180181

181182
if (csrfParam !== undefined && csrfToken !== undefined) {
182-
metadataInput += '<input name="' + csrfParam + '" value="' + csrfToken + '" type="hidden" />';
183+
dataInputs += '<input name="' + csrfParam + '" value="' + csrfToken + '" type="hidden" />';
184+
}
185+
186+
if (params) {
187+
188+
function buildParamsInputs(key, value) {
189+
switch (typeof value) {
190+
case 'array':
191+
var result = [];
192+
for (var i = 0, l = value.length; i < l; i++) {
193+
result.push( buildParamsInputs(key === null ? i : key + '[' + i + ']', value[i]) );
194+
}
195+
return result.join('');
196+
case 'object':
197+
var result = [];
198+
for (var i in value) {
199+
result.push( buildParamsInputs(key === null ? i : key + '[' + i + ']', value[i]) );
200+
}
201+
return result.join('');
202+
default:
203+
return '<input name="' + key + '" value="' + String(value).replace(/"/g, '&quot;') + '" type="hidden" />';
204+
}
205+
}
206+
207+
dataInputs += buildParamsInputs(null, params);
183208
}
184209

185210
if (target) { form.attr('target', target); }
186211

187-
form.hide().append(metadataInput).appendTo('body');
212+
form.hide().append(dataInputs).appendTo('body');
188213
form.submit();
189214
},
190215

test/public/test/data-method.js

+25
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,31 @@ asyncTest('link with "data-method" set to "delete"', 3, function() {
2929
});
3030
});
3131

32+
var escapeMap = {
33+
'<': '&lt;',
34+
'>': '&gt;'
35+
};
36+
function escapeReplacer (entity) { return escapeMap[entity] || entity; }
37+
function escapeHTML(str) { return String(str).replace(/<|>/g, escapeReplacer); }
38+
39+
asyncTest('link with "data-method" set to "post" and "data-params"', 4, function() {
40+
var value1 = 0,
41+
value2 = '\'quoted"/>&<\'value"',
42+
value3 = {foo: {bar: {baz: value2}}},
43+
params = {
44+
data1: value1,
45+
data2: value2,
46+
data3: value3
47+
};
48+
$('a[data-method]').attr({'data-method': 'post', 'data-params': JSON.stringify(params)});
49+
submit(function(data) {
50+
equal(data.REQUEST_METHOD, 'POST');
51+
equal(data.params.data1, escapeHTML(value1), 'params should have key data1 with right value');
52+
equal(data.params.data2, escapeHTML(value2), 'params should have key data2 with right value');
53+
propEqual(data.params.data3, {foo: {bar: {baz: escapeHTML(value2)}}}, 'params should have key data3 with right value');
54+
});
55+
});
56+
3257
asyncTest('link with "data-method" and CSRF', 1, function() {
3358
$('#qunit-fixture')
3459
.append('<meta name="csrf-param" content="authenticity_token"/>')

0 commit comments

Comments
 (0)