rails-backbone 0.5.1 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +8 -1
- data/lib/generators/backbone/install/install_generator.rb +1 -1
- data/lib/generators/backbone/install/templates/app.coffee +1 -1
- data/lib/generators/backbone/resource_helpers.rb +16 -4
- data/lib/generators/backbone/router/templates/router.coffee +1 -1
- data/lib/generators/backbone/router/templates/view.coffee +1 -1
- data/lib/generators/backbone/scaffold/templates/router.coffee +2 -2
- data/lib/generators/backbone/scaffold/templates/views/index_view.coffee +5 -5
- data/lib/generators/backbone/scaffold/templates/views/model_view.coffee +1 -1
- data/vendor/assets/javascripts/backbone.js +18 -12
- data/vendor/assets/javascripts/backbone_rails_sync.js +5 -1
- data/vendor/assets/javascripts/underscore.js +37 -16
- metadata +5 -5
data/README.md
CHANGED
@@ -53,7 +53,13 @@ This generator creates a router, views, templates, model and collection to creat
|
|
53
53
|
|
54
54
|
## Example Usage
|
55
55
|
|
56
|
-
|
56
|
+
Created a new rails 3.1 application called `blog`.
|
57
|
+
|
58
|
+
rails new blog
|
59
|
+
|
60
|
+
Edit your Gemfile and add
|
61
|
+
|
62
|
+
gem 'rails-backbone'
|
57
63
|
|
58
64
|
Install the gem and generate scaffolding.
|
59
65
|
|
@@ -73,6 +79,7 @@ Edit your posts index view `app/views/posts/index.html.erb` with the following c
|
|
73
79
|
|
74
80
|
<script type="text/javascript">
|
75
81
|
$(function() {
|
82
|
+
// Blog is the app name
|
76
83
|
window.router = new Blog.Routers.PostsRouter({posts: <%= @posts.to_json.html_safe -%>});
|
77
84
|
Backbone.history.start();
|
78
85
|
});
|
@@ -7,25 +7,37 @@ module Backbone
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def model_namespace
|
10
|
-
[application_name.
|
10
|
+
[application_name.camelize, "Models", class_name].join(".")
|
11
|
+
end
|
12
|
+
|
13
|
+
def singular_model_name
|
14
|
+
uncapitalize singular_name.camelize
|
15
|
+
end
|
16
|
+
|
17
|
+
def plural_model_name
|
18
|
+
uncapitalize(plural_name.camelize)
|
11
19
|
end
|
12
20
|
|
13
21
|
def collection_namespace
|
14
|
-
[application_name.
|
22
|
+
[application_name.camelize, "Collections", plural_name.camelize].join(".")
|
15
23
|
end
|
16
24
|
|
17
25
|
def view_namespace
|
18
|
-
[application_name.
|
26
|
+
[application_name.camelize, "Views", plural_name.camelize].join(".")
|
19
27
|
end
|
20
28
|
|
21
29
|
def router_namespace
|
22
|
-
[application_name.
|
30
|
+
[application_name.camelize, "Routers", plural_name.camelize].join(".")
|
23
31
|
end
|
24
32
|
|
25
33
|
def jst(action)
|
26
34
|
"backbone/templates/#{plural_name}/#{action}"
|
27
35
|
end
|
28
36
|
|
37
|
+
def uncapitalize(str)
|
38
|
+
str[0, 1].downcase + str[1..-1]
|
39
|
+
end
|
40
|
+
|
29
41
|
end
|
30
42
|
end
|
31
43
|
end
|
@@ -8,7 +8,7 @@ class <%= router_namespace %>Router extends Backbone.Router
|
|
8
8
|
|
9
9
|
<% actions.each do |action| -%>
|
10
10
|
<%= action %>: ->
|
11
|
-
@view = new <%= "#{view_namespace}.#{action.
|
11
|
+
@view = new <%= "#{view_namespace}.#{action.camelize}View()" %>
|
12
12
|
$("#<%= plural_name %>").html(@view.render().el)
|
13
13
|
|
14
14
|
<% end -%>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class <%= router_namespace %>Router extends Backbone.Router
|
2
2
|
initialize: (options) ->
|
3
|
-
@<%=
|
4
|
-
@<%=
|
3
|
+
@<%= plural_model_name %> = new <%= collection_namespace %>Collection()
|
4
|
+
@<%= plural_model_name %>.reset options.<%= plural_model_name %>
|
5
5
|
|
6
6
|
routes:
|
7
7
|
"/new": "new<%= class_name %>"
|
@@ -6,17 +6,17 @@ class <%= view_namespace %>.IndexView extends Backbone.View
|
|
6
6
|
initialize: () ->
|
7
7
|
_.bindAll(this, 'addOne', 'addAll', 'render');
|
8
8
|
|
9
|
-
@options.<%=
|
9
|
+
@options.<%= plural_model_name %>.bind('reset', this.addAll);
|
10
10
|
|
11
11
|
addAll: () ->
|
12
|
-
@options.<%=
|
12
|
+
@options.<%= plural_model_name %>.each(this.addOne)
|
13
13
|
|
14
|
-
addOne: (<%=
|
15
|
-
view = new <%= view_namespace %>.<%= singular_name.
|
14
|
+
addOne: (<%= singular_model_name %>) ->
|
15
|
+
view = new <%= view_namespace %>.<%= singular_name.camelize %>View({model : <%= singular_model_name %>})
|
16
16
|
this.$("tbody").append(view.render().el)
|
17
17
|
|
18
18
|
render: ->
|
19
|
-
$(this.el).html(this.template(<%=
|
19
|
+
$(this.el).html(this.template(<%= plural_model_name %>: this.options.<%= plural_model_name %>.toJSON() ))
|
20
20
|
@addAll()
|
21
21
|
|
22
22
|
return this
|
@@ -1,4 +1,4 @@
|
|
1
|
-
// Backbone.js 0.5.
|
1
|
+
// Backbone.js 0.5.2
|
2
2
|
// (c) 2010 Jeremy Ashkenas, DocumentCloud Inc.
|
3
3
|
// Backbone may be freely distributed under the MIT license.
|
4
4
|
// For all details and documentation:
|
@@ -25,7 +25,7 @@
|
|
25
25
|
}
|
26
26
|
|
27
27
|
// Current version of the library. Keep in sync with `package.json`.
|
28
|
-
Backbone.VERSION = '0.5.
|
28
|
+
Backbone.VERSION = '0.5.2';
|
29
29
|
|
30
30
|
// Require Underscore, if we're on the server, and it's not already present.
|
31
31
|
var _ = root._;
|
@@ -41,7 +41,7 @@
|
|
41
41
|
return this;
|
42
42
|
};
|
43
43
|
|
44
|
-
// Turn on `emulateHTTP` to
|
44
|
+
// Turn on `emulateHTTP` to support legacy HTTP servers. Setting this option will
|
45
45
|
// fake `"PUT"` and `"DELETE"` requests via the `_method` parameter and set a
|
46
46
|
// `X-Http-Method-Override` header.
|
47
47
|
Backbone.emulateHTTP = false;
|
@@ -68,10 +68,10 @@
|
|
68
68
|
|
69
69
|
// Bind an event, specified by a string name, `ev`, to a `callback` function.
|
70
70
|
// Passing `"all"` will bind the callback to all events fired.
|
71
|
-
bind : function(ev, callback) {
|
71
|
+
bind : function(ev, callback, context) {
|
72
72
|
var calls = this._callbacks || (this._callbacks = {});
|
73
73
|
var list = calls[ev] || (calls[ev] = []);
|
74
|
-
list.push(callback);
|
74
|
+
list.push([callback, context]);
|
75
75
|
return this;
|
76
76
|
},
|
77
77
|
|
@@ -89,7 +89,7 @@
|
|
89
89
|
var list = calls[ev];
|
90
90
|
if (!list) return this;
|
91
91
|
for (var i = 0, l = list.length; i < l; i++) {
|
92
|
-
if (callback === list[i]) {
|
92
|
+
if (list[i] && callback === list[i][0]) {
|
93
93
|
list[i] = null;
|
94
94
|
break;
|
95
95
|
}
|
@@ -114,7 +114,7 @@
|
|
114
114
|
list.splice(i, 1); i--; l--;
|
115
115
|
} else {
|
116
116
|
args = both ? Array.prototype.slice.call(arguments, 1) : arguments;
|
117
|
-
callback.apply(this, args);
|
117
|
+
callback[0].apply(callback[1] || this, args);
|
118
118
|
}
|
119
119
|
}
|
120
120
|
}
|
@@ -133,7 +133,7 @@
|
|
133
133
|
var defaults;
|
134
134
|
attributes || (attributes = {});
|
135
135
|
if (defaults = this.defaults) {
|
136
|
-
if (_.isFunction(defaults)) defaults = defaults();
|
136
|
+
if (_.isFunction(defaults)) defaults = defaults.call(this);
|
137
137
|
attributes = _.extend({}, defaults, attributes);
|
138
138
|
}
|
139
139
|
this.attributes = {};
|
@@ -641,7 +641,7 @@
|
|
641
641
|
var methods = ['forEach', 'each', 'map', 'reduce', 'reduceRight', 'find', 'detect',
|
642
642
|
'filter', 'select', 'reject', 'every', 'all', 'some', 'any', 'include',
|
643
643
|
'contains', 'invoke', 'max', 'min', 'sortBy', 'sortedIndex', 'toArray', 'size',
|
644
|
-
'first', 'rest', 'last', 'without', 'indexOf', 'lastIndexOf', 'isEmpty'];
|
644
|
+
'first', 'rest', 'last', 'without', 'indexOf', 'lastIndexOf', 'isEmpty', 'groupBy'];
|
645
645
|
|
646
646
|
// Mix in each Underscore method as a proxy to `Collection#models`.
|
647
647
|
_.each(methods, function(method) {
|
@@ -806,6 +806,8 @@
|
|
806
806
|
if (this._wantsPushState && !this._hasPushState && !atRoot) {
|
807
807
|
this.fragment = this.getFragment(null, true);
|
808
808
|
window.location.replace(this.options.root + '#' + this.fragment);
|
809
|
+
// Return immediately as browser will do redirect to new url
|
810
|
+
return true;
|
809
811
|
} else if (this._wantsPushState && this._hasPushState && atRoot && loc.hash) {
|
810
812
|
this.fragment = loc.hash.replace(hashStrip, '');
|
811
813
|
window.history.replaceState({}, document.title, loc.protocol + '//' + loc.host + this.options.root + this.fragment);
|
@@ -947,6 +949,7 @@
|
|
947
949
|
// not `change`, `submit`, and `reset` in Internet Explorer.
|
948
950
|
delegateEvents : function(events) {
|
949
951
|
if (!(events || (events = this.events))) return;
|
952
|
+
if (_.isFunction(events)) events = events.call(this);
|
950
953
|
$(this.el).unbind('.delegateEvents' + this.cid);
|
951
954
|
for (var key in events) {
|
952
955
|
var method = this[events[key]];
|
@@ -1035,8 +1038,7 @@
|
|
1035
1038
|
// Default JSON-request options.
|
1036
1039
|
var params = _.extend({
|
1037
1040
|
type: type,
|
1038
|
-
dataType: 'json'
|
1039
|
-
processData: false
|
1041
|
+
dataType: 'json'
|
1040
1042
|
}, options);
|
1041
1043
|
|
1042
1044
|
// Ensure that we have a URL.
|
@@ -1053,7 +1055,6 @@
|
|
1053
1055
|
// For older servers, emulate JSON by encoding the request into an HTML-form.
|
1054
1056
|
if (Backbone.emulateJSON) {
|
1055
1057
|
params.contentType = 'application/x-www-form-urlencoded';
|
1056
|
-
params.processData = true;
|
1057
1058
|
params.data = params.data ? {model : params.data} : {};
|
1058
1059
|
}
|
1059
1060
|
|
@@ -1069,6 +1070,11 @@
|
|
1069
1070
|
}
|
1070
1071
|
}
|
1071
1072
|
|
1073
|
+
// Don't process data on a non-GET request.
|
1074
|
+
if (params.type !== 'GET' && ! Backbone.emulateJSON) {
|
1075
|
+
params.processData = false;
|
1076
|
+
}
|
1077
|
+
|
1072
1078
|
// Make the request.
|
1073
1079
|
return $.ajax(params);
|
1074
1080
|
};
|
@@ -22,7 +22,6 @@
|
|
22
22
|
var params = _.extend({
|
23
23
|
type: type,
|
24
24
|
dataType: 'json',
|
25
|
-
processData: false,
|
26
25
|
beforeSend: function( xhr ) {
|
27
26
|
var token = $('meta[name="csrf-token"]').attr('content');
|
28
27
|
if (token) xhr.setRequestHeader('X-CSRF-Token', token);
|
@@ -48,6 +47,11 @@
|
|
48
47
|
params.data = JSON.stringify(data)
|
49
48
|
}
|
50
49
|
|
50
|
+
// Don't process data on a non-GET request.
|
51
|
+
if (params.type !== 'GET') {
|
52
|
+
params.processData = false;
|
53
|
+
}
|
54
|
+
|
51
55
|
// Make the request.
|
52
56
|
return $.ajax(params);
|
53
57
|
}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
// Underscore.js 1.1.
|
1
|
+
// Underscore.js 1.1.7
|
2
2
|
// (c) 2011 Jeremy Ashkenas, DocumentCloud Inc.
|
3
3
|
// Underscore is freely distributable under the MIT license.
|
4
4
|
// Portions of Underscore are inspired or borrowed from Prototype,
|
@@ -60,19 +60,19 @@
|
|
60
60
|
}
|
61
61
|
|
62
62
|
// Current version.
|
63
|
-
_.VERSION = '1.1.
|
63
|
+
_.VERSION = '1.1.7';
|
64
64
|
|
65
65
|
// Collection Functions
|
66
66
|
// --------------------
|
67
67
|
|
68
68
|
// The cornerstone, an `each` implementation, aka `forEach`.
|
69
|
-
// Handles objects
|
69
|
+
// Handles objects with the built-in `forEach`, arrays, and raw objects.
|
70
70
|
// Delegates to **ECMAScript 5**'s native `forEach` if available.
|
71
71
|
var each = _.each = _.forEach = function(obj, iterator, context) {
|
72
72
|
if (obj == null) return;
|
73
73
|
if (nativeForEach && obj.forEach === nativeForEach) {
|
74
74
|
obj.forEach(iterator, context);
|
75
|
-
} else if (
|
75
|
+
} else if (obj.length === +obj.length) {
|
76
76
|
for (var i = 0, l = obj.length; i < l; i++) {
|
77
77
|
if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return;
|
78
78
|
}
|
@@ -107,7 +107,7 @@
|
|
107
107
|
return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
|
108
108
|
}
|
109
109
|
each(obj, function(value, index, list) {
|
110
|
-
if (!initial
|
110
|
+
if (!initial) {
|
111
111
|
memo = value;
|
112
112
|
initial = true;
|
113
113
|
} else {
|
@@ -182,14 +182,14 @@
|
|
182
182
|
// Delegates to **ECMAScript 5**'s native `some` if available.
|
183
183
|
// Aliased as `any`.
|
184
184
|
var any = _.some = _.any = function(obj, iterator, context) {
|
185
|
-
iterator
|
185
|
+
iterator = iterator || _.identity;
|
186
186
|
var result = false;
|
187
187
|
if (obj == null) return result;
|
188
188
|
if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
|
189
189
|
each(obj, function(value, index, list) {
|
190
|
-
if (result
|
190
|
+
if (result |= iterator.call(context, value, index, list)) return breaker;
|
191
191
|
});
|
192
|
-
return result;
|
192
|
+
return !!result;
|
193
193
|
};
|
194
194
|
|
195
195
|
// Determine if a given value is included in the array or object using `===`.
|
@@ -327,23 +327,34 @@
|
|
327
327
|
|
328
328
|
// Return a version of the array that does not contain the specified value(s).
|
329
329
|
_.without = function(array) {
|
330
|
-
|
331
|
-
return _.filter(array, function(value){ return !_.include(values, value); });
|
330
|
+
return _.difference(array, slice.call(arguments, 1));
|
332
331
|
};
|
333
332
|
|
334
333
|
// Produce a duplicate-free version of the array. If the array has already
|
335
334
|
// been sorted, you have the option of using a faster algorithm.
|
336
335
|
// Aliased as `unique`.
|
337
|
-
_.uniq = _.unique = function(array, isSorted) {
|
338
|
-
|
339
|
-
|
336
|
+
_.uniq = _.unique = function(array, isSorted, iterator) {
|
337
|
+
var initial = iterator ? _.map(array, iterator) : array;
|
338
|
+
var result = [];
|
339
|
+
_.reduce(initial, function(memo, el, i) {
|
340
|
+
if (0 == i || (isSorted === true ? _.last(memo) != el : !_.include(memo, el))) {
|
341
|
+
memo[memo.length] = el;
|
342
|
+
result[result.length] = array[i];
|
343
|
+
}
|
340
344
|
return memo;
|
341
345
|
}, []);
|
346
|
+
return result;
|
347
|
+
};
|
348
|
+
|
349
|
+
// Produce an array that contains the union: each distinct element from all of
|
350
|
+
// the passed-in arrays.
|
351
|
+
_.union = function() {
|
352
|
+
return _.uniq(_.flatten(arguments));
|
342
353
|
};
|
343
354
|
|
344
355
|
// Produce an array that contains every item shared between all the
|
345
|
-
// passed-in arrays.
|
346
|
-
_.intersect = function(array) {
|
356
|
+
// passed-in arrays. (Aliased as "intersect" for back-compat.)
|
357
|
+
_.intersection = _.intersect = function(array) {
|
347
358
|
var rest = slice.call(arguments, 1);
|
348
359
|
return _.filter(_.uniq(array), function(item) {
|
349
360
|
return _.every(rest, function(other) {
|
@@ -352,6 +363,12 @@
|
|
352
363
|
});
|
353
364
|
};
|
354
365
|
|
366
|
+
// Take the difference between one array and another.
|
367
|
+
// Only the elements present in just the first array will remain.
|
368
|
+
_.difference = function(array, other) {
|
369
|
+
return _.filter(array, function(value){ return !_.include(other, value); });
|
370
|
+
};
|
371
|
+
|
355
372
|
// Zip together multiple lists into a single array -- elements that share
|
356
373
|
// an index go together.
|
357
374
|
_.zip = function() {
|
@@ -548,7 +565,11 @@
|
|
548
565
|
// Return a sorted list of the function names available on the object.
|
549
566
|
// Aliased as `methods`
|
550
567
|
_.functions = _.methods = function(obj) {
|
551
|
-
|
568
|
+
var names = [];
|
569
|
+
for (var key in obj) {
|
570
|
+
if (_.isFunction(obj[key])) names.push(key);
|
571
|
+
}
|
572
|
+
return names.sort();
|
552
573
|
};
|
553
574
|
|
554
575
|
// Extend a given object with all the properties in passed-in object(s).
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: rails-backbone
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.5.
|
5
|
+
version: 0.5.2
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Ryan Fitzgerald
|
@@ -11,7 +11,7 @@ autorequire:
|
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
13
|
|
14
|
-
date: 2011-07
|
14
|
+
date: 2011-08-07 00:00:00 -04:00
|
15
15
|
default_executable:
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
@@ -21,7 +21,7 @@ dependencies:
|
|
21
21
|
requirements:
|
22
22
|
- - ~>
|
23
23
|
- !ruby/object:Gem::Version
|
24
|
-
version: 3.1.0.
|
24
|
+
version: 3.1.0.rc5
|
25
25
|
type: :runtime
|
26
26
|
prerelease: false
|
27
27
|
version_requirements: *id001
|
@@ -103,7 +103,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
103
103
|
requirements:
|
104
104
|
- - ">="
|
105
105
|
- !ruby/object:Gem::Version
|
106
|
-
hash: -
|
106
|
+
hash: -2957060880255582041
|
107
107
|
segments:
|
108
108
|
- 0
|
109
109
|
version: "0"
|
@@ -112,7 +112,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
112
112
|
requirements:
|
113
113
|
- - ">="
|
114
114
|
- !ruby/object:Gem::Version
|
115
|
-
hash: -
|
115
|
+
hash: -2957060880255582041
|
116
116
|
segments:
|
117
117
|
- 0
|
118
118
|
version: "0"
|