backbone_sync-rails 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +7 -3
- data/lib/backbone_sync-rails/faye/event.rb +12 -3
- data/lib/backbone_sync-rails/faye.rb +1 -0
- data/lib/backbone_sync-rails/version.rb +1 -1
- data/vendor/assets/javascripts/backbone_sync-rails/rails_faye_subscriber.js.erb +46 -79
- data/vendor/assets/javascripts/extensions/backbone.collection.idempotent.js +1 -1
- metadata +10 -5
- data/lib/backbone_sync-rails/faye/message.rb +0 -31
data/README.md
CHANGED
@@ -59,18 +59,22 @@ This assumes you already have a Backbone.js + Rails app.
|
|
59
59
|
end
|
60
60
|
```
|
61
61
|
|
62
|
-
|
62
|
+
7. Instantiate a new `BackboneSync.RailsFayeSynchronizer` for *each instance*
|
63
63
|
of a Backbone collection you instantiate. You could do this in the
|
64
64
|
collection's constructor, or do it by hand:
|
65
65
|
|
66
66
|
```javascript
|
67
67
|
// For simplicitly, here it is in a router, or app bootstrap
|
68
68
|
this.users = new MyApp.Collections.UsersCollection();
|
69
|
-
new
|
69
|
+
var fayeClient = new Faye.Client('<%= BackboneSync::Rails::Faye.root_address %>/faye');
|
70
|
+
new BackboneSync.RailsFayeSubscriber(this.users, {
|
71
|
+
channel: 'users', // Set to Rails model.class.table_name, or override Model#faye_channel
|
72
|
+
client: fayeClient
|
73
|
+
});
|
70
74
|
this.wizards.reset(options.users);
|
71
75
|
```
|
72
76
|
|
73
|
-
|
77
|
+
8. Check it out! Open two browsers, do some stuff in one, and see your changes
|
74
78
|
cascade to the other. Your Backbone views will need to observe events on
|
75
79
|
the collection like `change`, `add`, and `remove`.
|
76
80
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'net/http'
|
2
2
|
|
3
3
|
module BackboneSync
|
4
4
|
module Rails
|
@@ -10,13 +10,22 @@ module BackboneSync
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def broadcast
|
13
|
-
|
13
|
+
Net::HTTP.post_form(uri, :message => message)
|
14
14
|
end
|
15
15
|
|
16
16
|
private
|
17
17
|
|
18
|
+
def uri
|
19
|
+
URI.parse("#{BackboneSync::Rails::Faye.root_address}/faye")
|
20
|
+
end
|
21
|
+
|
22
|
+
def message
|
23
|
+
{ :channel => channel, :data => data }.to_json
|
24
|
+
end
|
25
|
+
|
18
26
|
def channel
|
19
|
-
|
27
|
+
subchannel = @model.try(:faye_channel) || @model.class.table_name
|
28
|
+
"/sync/#{subchannel}"
|
20
29
|
end
|
21
30
|
|
22
31
|
def data
|
@@ -1,80 +1,47 @@
|
|
1
|
-
|
2
|
-
//
|
3
|
-
// window.BackboneSync = {}
|
4
|
-
//
|
5
|
-
// class BackboneSync.RailsFayeSubscriber
|
6
|
-
// constructor: (collection, options) ->
|
7
|
-
// @collection = collection
|
8
|
-
// @client = new Faye.Client('<%= BackboneSync::Rails::Faye.root_address %>/faye')
|
9
|
-
// @channel = options.channel
|
10
|
-
//
|
11
|
-
// @subscribe()
|
12
|
-
//
|
13
|
-
// subscribe: =>
|
14
|
-
// @client.subscribe "/sync/#{@channel}", @receive
|
15
|
-
//
|
16
|
-
// receive: (message) =>
|
17
|
-
// $.each message, (event, eventArguments) =>
|
18
|
-
// @[event](eventArguments)
|
19
|
-
//
|
20
|
-
// update: (params) =>
|
21
|
-
// $.each params, (id, attributes) =>
|
22
|
-
// model = @collection.get(id)
|
23
|
-
// model.set(attributes)
|
24
|
-
//
|
25
|
-
// create: (params) =>
|
26
|
-
// $.each params, (id, attributes) =>
|
27
|
-
// model = new @collection.model(attributes)
|
28
|
-
// @collection.add(model)
|
29
|
-
//
|
30
|
-
// destroy: (params) =>
|
31
|
-
// $.each params, (id, attributes) =>
|
32
|
-
// model = @collection.get(id)
|
33
|
-
// @collection.remove(model)
|
1
|
+
this.BackboneSync = this.BackboneSync || {};
|
34
2
|
|
35
|
-
(function() {
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
return
|
51
|
-
};
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
return
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
}).call(this);
|
3
|
+
BackboneSync.RailsFayeSubscriber = (function() {
|
4
|
+
function RailsFayeSubscriber(collection, options) {
|
5
|
+
this.collection = collection;
|
6
|
+
this.client = options.client;
|
7
|
+
this.channel = options.channel;
|
8
|
+
this.subscribe();
|
9
|
+
}
|
10
|
+
|
11
|
+
RailsFayeSubscriber.prototype.subscribe = function() {
|
12
|
+
return this.client.subscribe("/sync/" + this.channel, _.bind(this.receive, this));
|
13
|
+
};
|
14
|
+
|
15
|
+
RailsFayeSubscriber.prototype.receive = function(message) {
|
16
|
+
var self = this;
|
17
|
+
return $.each(message, function(event, eventArguments) {
|
18
|
+
return self[event](eventArguments);
|
19
|
+
});
|
20
|
+
};
|
21
|
+
|
22
|
+
RailsFayeSubscriber.prototype.update = function(params) {
|
23
|
+
var self = this;
|
24
|
+
return $.each(params, function(id, attributes) {
|
25
|
+
var model = self.collection.get(id);
|
26
|
+
return model.set(attributes);
|
27
|
+
});
|
28
|
+
};
|
29
|
+
|
30
|
+
RailsFayeSubscriber.prototype.create = function(params) {
|
31
|
+
var self = this;
|
32
|
+
return $.each(params, function(id, attributes) {
|
33
|
+
var model = new self.collection.model(attributes);
|
34
|
+
return self.collection.add(model);
|
35
|
+
});
|
36
|
+
};
|
37
|
+
|
38
|
+
RailsFayeSubscriber.prototype.destroy = function(params) {
|
39
|
+
var self = this;
|
40
|
+
return $.each(params, function(id, attributes) {
|
41
|
+
var model = self.collection.get(id);
|
42
|
+
return self.collection.remove(model);
|
43
|
+
});
|
44
|
+
};
|
45
|
+
|
46
|
+
return RailsFayeSubscriber;
|
47
|
+
})();
|
@@ -2,7 +2,7 @@ Backbone.Collection.prototype._addWithIdCheck = function(model, options) {
|
|
2
2
|
var idAttribute = model.idAttribute || this.model.prototype.idAttribute;
|
3
3
|
var modelId = model[idAttribute];
|
4
4
|
|
5
|
-
if (this.get(modelId) === undefined) {
|
5
|
+
if (modelId === undefined || this.get(modelId) === undefined) {
|
6
6
|
this._addWithoutIdCheck(model, options);
|
7
7
|
}
|
8
8
|
};
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: backbone_sync-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Jason Morrison
|
@@ -10,12 +10,11 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-09-
|
13
|
+
date: 2011-09-21 00:00:00 -04:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: rails
|
18
|
-
prerelease: false
|
19
18
|
requirement: &id001 !ruby/object:Gem::Requirement
|
20
19
|
none: false
|
21
20
|
requirements:
|
@@ -23,10 +22,10 @@ dependencies:
|
|
23
22
|
- !ruby/object:Gem::Version
|
24
23
|
version: 3.0.0
|
25
24
|
type: :runtime
|
25
|
+
prerelease: false
|
26
26
|
version_requirements: *id001
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: sqlite3
|
29
|
-
prerelease: false
|
30
29
|
requirement: &id002 !ruby/object:Gem::Requirement
|
31
30
|
none: false
|
32
31
|
requirements:
|
@@ -34,6 +33,7 @@ dependencies:
|
|
34
33
|
- !ruby/object:Gem::Version
|
35
34
|
version: "0"
|
36
35
|
type: :development
|
36
|
+
prerelease: false
|
37
37
|
version_requirements: *id002
|
38
38
|
description: Broadcast changes from Rails models to client-side Backbone.js collections with WebSockets.
|
39
39
|
email:
|
@@ -46,7 +46,6 @@ extra_rdoc_files: []
|
|
46
46
|
|
47
47
|
files:
|
48
48
|
- lib/backbone_sync-rails/faye/event.rb
|
49
|
-
- lib/backbone_sync-rails/faye/message.rb
|
50
49
|
- lib/backbone_sync-rails/faye/observer.rb
|
51
50
|
- lib/backbone_sync-rails/faye.rb
|
52
51
|
- lib/backbone_sync-rails/version.rb
|
@@ -100,12 +99,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
100
99
|
requirements:
|
101
100
|
- - ">="
|
102
101
|
- !ruby/object:Gem::Version
|
102
|
+
hash: 2403046260054443418
|
103
|
+
segments:
|
104
|
+
- 0
|
103
105
|
version: "0"
|
104
106
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
105
107
|
none: false
|
106
108
|
requirements:
|
107
109
|
- - ">="
|
108
110
|
- !ruby/object:Gem::Version
|
111
|
+
hash: 2403046260054443418
|
112
|
+
segments:
|
113
|
+
- 0
|
109
114
|
version: "0"
|
110
115
|
requirements: []
|
111
116
|
|
@@ -1,31 +0,0 @@
|
|
1
|
-
require 'net/http'
|
2
|
-
require 'json'
|
3
|
-
|
4
|
-
module BackboneSync
|
5
|
-
module Rails
|
6
|
-
module Faye
|
7
|
-
# To publish from outside of an `EM.run {}` loop:
|
8
|
-
# http://groups.google.com/group/faye-users/browse_thread/thread/ae6e2a1cc37b3b07
|
9
|
-
class Message
|
10
|
-
def initialize(channel, data)
|
11
|
-
@channel = channel
|
12
|
-
@data = data
|
13
|
-
end
|
14
|
-
|
15
|
-
def send
|
16
|
-
Net::HTTP.post_form(uri, :message => payload)
|
17
|
-
end
|
18
|
-
|
19
|
-
private
|
20
|
-
|
21
|
-
def uri
|
22
|
-
URI.parse("#{BackboneSync::Rails::Faye.root_address}/faye")
|
23
|
-
end
|
24
|
-
|
25
|
-
def payload
|
26
|
-
{:channel => @channel, :data => @data}.to_json
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|