diff --git a/public/javascripts/rest.js b/public/javascripts/rest.js new file mode 100644 index 0000000..f719095 --- /dev/null +++ b/public/javascripts/rest.js @@ -0,0 +1,137 @@ +/* +* Copyright (c) 2010 Lyconic, LLC. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +* THE SOFTWARE. +*/ + +(function($){ + + // Change the values of this global object if your method parameter is different. + $.restSetup = { methodParam: '_method' }; + + // collects the csrf-param and csrf-token from meta tags + $(document).ready(function(){ + $.extend($.restSetup, { + csrfParam: $('meta[name=csrf-param]').attr('content'), + csrfToken: $('meta[name=csrf-token]').attr('content') + }); + }); + + // jQuery doesn't provide a better way of intercepting the ajax settings object + var _ajax = $.ajax, options; + + function collect_options (url, data, success, error) { + options = { dataType: 'json' }; + if (arguments.length === 1 && typeof arguments[0] !== "string") { + options = $.extend(options, url); + if ("url" in options) + if ("data" in options) { + fill_url(options.url, options.data); + } + } else { + // shift arguments if data argument was omitted + if ($.isFunction(data)) { + error = success; + success = data; + data = null; + } + + url = fill_url(url, data); + + options = $.extend(options, { + url: url, + data: data, + success: success, + error: error + }); + } + } + + function fill_url (url, data) { + var key, u, val; + for (key in data) { + val = data[key]; + u = url.replace('{'+key+'}', val); + if (u != url) { + url = u; + delete data[key]; + } + } + return url; + } + + // public functions + + function ajax (settings) { + settings.type = settings.type || "GET"; + + if (typeof settings.data !== "string") + if (settings.data != null) { + settings.data = $.param(settings.data); + } + + settings.data = settings.data || ""; + + if ($.restSetup.csrf && !$.isEmptyObject($.restSetup.csrf)) + if (!/^(get)$/i.test(settings.type)) + if (!/(authenticity_token=)/i.test(settings.data)) { + settings.data += (settings.data ? "&" : "") + $.restSetup.csrfParam + '=' + $restSetup.csrfToken; + } + + if (!/^(get|post)$/i.test(settings.type)) { + settings.data += (settings.data ? "&" : "") + $.restSetup.methodParam + '=' + settings.type.toLowerCase(); + settings.type = "POST"; + } + + return _ajax.call(this, settings); + } + + function read () { + collect_options.apply(this, arguments); + $.extend(options, { type: 'GET' }) + return $.ajax(options); + } + + function create () { + collect_options.apply(this, arguments); + $.extend(options, { type: 'POST' }); + return $.ajax(options); + } + + function update () { + collect_options.apply(this, arguments); + $.extend(options, { type: 'PUT' }); + return $.ajax(options); + } + + function destroy () { + collect_options.apply(this, arguments); + $.extend(options, { type: 'DELETE' }); + return $.ajax(options); + } + + $.extend({ + ajax: ajax, + read: read, + create: create, + update: update, + destroy: destroy + }); + +})(jQuery); \ No newline at end of file