websocket-rails 0.1.3 → 0.1.4
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/CHANGELOG.md +11 -0
- data/Gemfile +7 -0
- data/README.md +15 -16
- data/lib/assets/javascripts/websocket_rails/channel.js +35 -0
- data/lib/assets/javascripts/websocket_rails/http_connection.js +68 -0
- data/lib/assets/javascripts/websocket_rails/main.js +4 -0
- data/lib/assets/javascripts/websocket_rails/websocket_connection.js +38 -0
- data/lib/assets/javascripts/websocket_rails/websocket_rails.js +100 -0
- data/lib/generators/websocket_rails/install/install_generator.rb +32 -0
- data/lib/generators/websocket_rails/install/templates/events.rb +14 -0
- data/lib/websocket-rails.rb +4 -0
- data/lib/websocket_rails/base_controller.rb +4 -2
- data/lib/websocket_rails/channel.rb +35 -0
- data/lib/websocket_rails/channel_manager.rb +28 -0
- data/lib/websocket_rails/connection_adapters.rb +35 -4
- data/lib/websocket_rails/connection_manager.rb +3 -1
- data/lib/websocket_rails/dispatcher.rb +22 -12
- data/lib/websocket_rails/event.rb +31 -17
- data/lib/websocket_rails/event_map.rb +14 -6
- data/lib/websocket_rails/event_queue.rb +27 -0
- data/lib/websocket_rails/internal_events.rb +19 -0
- data/lib/websocket_rails/version.rb +1 -1
- data/spec/dummy/config/initializers/events.rb +5 -5
- data/spec/dummy/log/test.log +180 -0
- data/spec/integration/connection_manager_spec.rb +21 -8
- data/spec/support/helper_methods.rb +2 -2
- data/spec/support/mock_web_socket.rb +4 -0
- data/spec/unit/channel_manager_spec.rb +29 -0
- data/spec/unit/channel_spec.rb +46 -0
- data/spec/unit/connection_adapters_spec.rb +20 -0
- data/spec/unit/dispatcher_spec.rb +13 -2
- data/spec/unit/event_map_spec.rb +2 -2
- data/spec/unit/event_queue_spec.rb +36 -0
- data/spec/unit/event_spec.rb +26 -3
- metadata +24 -28
- data/assets/javascripts/http_dispatcher.js +0 -78
- data/assets/javascripts/websocket_dispatcher.js +0 -66
@@ -0,0 +1,28 @@
|
|
1
|
+
module WebsocketRails
|
2
|
+
|
3
|
+
class << self
|
4
|
+
|
5
|
+
def channel_manager
|
6
|
+
@channel_manager ||= ChannelManager.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def [](channel)
|
10
|
+
channel_manager[channel]
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
class ChannelManager
|
16
|
+
|
17
|
+
attr_reader :channels
|
18
|
+
|
19
|
+
def initialize
|
20
|
+
@channels = Hash.new.with_indifferent_access
|
21
|
+
end
|
22
|
+
|
23
|
+
def [](channel)
|
24
|
+
@channels[channel] ||= Channel.new channel
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
@@ -24,17 +24,18 @@ module WebsocketRails
|
|
24
24
|
ConnectionAdapters.register adapter
|
25
25
|
end
|
26
26
|
|
27
|
-
|
27
|
+
attr_reader :dispatcher, :queue
|
28
28
|
|
29
29
|
def initialize(env,dispatcher)
|
30
|
-
@env
|
30
|
+
@env = env
|
31
|
+
@queue = EventQueue.new
|
31
32
|
@dispatcher = dispatcher
|
32
33
|
end
|
33
34
|
|
34
35
|
def on_open(data=nil)
|
35
36
|
event = Event.new_on_open( self, data )
|
36
37
|
dispatch event
|
37
|
-
|
38
|
+
trigger event
|
38
39
|
end
|
39
40
|
|
40
41
|
def on_message(encoded_data)
|
@@ -51,7 +52,29 @@ module WebsocketRails
|
|
51
52
|
dispatch event
|
52
53
|
on_close event.data
|
53
54
|
end
|
54
|
-
|
55
|
+
|
56
|
+
def enqueue(event)
|
57
|
+
@queue << event
|
58
|
+
end
|
59
|
+
|
60
|
+
def trigger(event)
|
61
|
+
enqueue event
|
62
|
+
unless flush_scheduled
|
63
|
+
EM.next_tick { flush; flush_scheduled = false }
|
64
|
+
flush_scheduled = true
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def flush
|
69
|
+
message = "["
|
70
|
+
@queue.flush do |event|
|
71
|
+
message << event.serialize
|
72
|
+
message << "," unless event == @queue.last
|
73
|
+
end
|
74
|
+
message << "]"
|
75
|
+
send message
|
76
|
+
end
|
77
|
+
|
55
78
|
def send(message)
|
56
79
|
raise NotImplementedError, "Override this method in the connection specific adapter class"
|
57
80
|
end
|
@@ -73,6 +96,14 @@ module WebsocketRails
|
|
73
96
|
def close_connection
|
74
97
|
dispatcher.connection_manager.close_connection self
|
75
98
|
end
|
99
|
+
|
100
|
+
def flush_scheduled
|
101
|
+
@flush_scheduled
|
102
|
+
end
|
103
|
+
|
104
|
+
def flush_scheduled=(value)
|
105
|
+
@flush_scheduled = value
|
106
|
+
end
|
76
107
|
end
|
77
108
|
|
78
109
|
end
|
@@ -21,17 +21,19 @@ module WebsocketRails
|
|
21
21
|
|
22
22
|
def initialize
|
23
23
|
@connections = []
|
24
|
-
@dispatcher
|
24
|
+
@dispatcher = Dispatcher.new( self )
|
25
25
|
end
|
26
26
|
|
27
27
|
# Primary entry point for the Rack application
|
28
28
|
def call(env)
|
29
29
|
request = Rack::Request.new env
|
30
|
+
|
30
31
|
if request.post?
|
31
32
|
response = parse_incoming_event request.params
|
32
33
|
else
|
33
34
|
response = open_connection env
|
34
35
|
end
|
36
|
+
|
35
37
|
response
|
36
38
|
rescue InvalidConnectionError
|
37
39
|
BadRequestResponse
|
@@ -19,6 +19,28 @@ module WebsocketRails
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def dispatch(event)
|
22
|
+
if event.is_channel?
|
23
|
+
WebsocketRails[event.channel].trigger_event event
|
24
|
+
else
|
25
|
+
route event
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def send_message(event)
|
30
|
+
puts "sending message: #{event.serialize}"
|
31
|
+
event.connection.trigger event
|
32
|
+
end
|
33
|
+
|
34
|
+
def broadcast_message(event)
|
35
|
+
puts "broadcasting message: #{event.serialize}"
|
36
|
+
connection_manager.connections.map do |connection|
|
37
|
+
connection.trigger event
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def route(event)
|
22
44
|
actions = []
|
23
45
|
event_map.routes_for event do |controller,method|
|
24
46
|
actions << Fiber.new do
|
@@ -33,18 +55,6 @@ module WebsocketRails
|
|
33
55
|
end
|
34
56
|
execute actions
|
35
57
|
end
|
36
|
-
|
37
|
-
def send_message(event)
|
38
|
-
event.connection.send event.serialize
|
39
|
-
end
|
40
|
-
|
41
|
-
def broadcast_message(event)
|
42
|
-
connection_manager.connections.map do |connection|
|
43
|
-
connection.send event.serialize
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
private
|
48
58
|
|
49
59
|
def execute(actions)
|
50
60
|
actions.map do |action|
|
@@ -4,36 +4,48 @@ module WebsocketRails
|
|
4
4
|
class Event
|
5
5
|
|
6
6
|
def self.new_from_json(encoded_data,connection)
|
7
|
-
event_name, data, namespace = decode encoded_data
|
8
|
-
Event.new event_name, data,
|
7
|
+
event_name, data, namespace, channel = decode encoded_data
|
8
|
+
Event.new event_name, data,
|
9
|
+
:connection => connection,
|
10
|
+
:namespace => namespace,
|
11
|
+
:channel => channel
|
9
12
|
end
|
10
13
|
|
11
14
|
def self.new_on_open(connection,data=nil)
|
12
15
|
connection_id = { :connection_id => connection.id }
|
13
16
|
on_open_data = data.is_a?(Hash) ? data.merge(connection_id) : connection_id
|
14
17
|
|
15
|
-
Event.new :client_connected, on_open_data, connection
|
18
|
+
Event.new :client_connected, on_open_data, :connection => connection
|
16
19
|
end
|
17
20
|
|
18
21
|
def self.new_on_close(connection,data=nil)
|
19
|
-
Event.new :client_disconnected, data, connection
|
22
|
+
Event.new :client_disconnected, data, :connection => connection
|
20
23
|
end
|
21
24
|
|
22
25
|
def self.new_on_error(connection,data=nil)
|
23
|
-
Event.new :client_error, data, connection
|
26
|
+
Event.new :client_error, data, :connection => connection
|
24
27
|
end
|
25
28
|
|
26
|
-
attr_reader :name, :data, :connection, :namespace
|
29
|
+
attr_reader :name, :data, :connection, :namespace, :channel
|
27
30
|
|
28
|
-
def initialize(event_name,data,
|
29
|
-
@name
|
30
|
-
@data
|
31
|
-
@
|
32
|
-
|
31
|
+
def initialize(event_name,data,options={})
|
32
|
+
@name = event_name.to_sym
|
33
|
+
@data = data.is_a?(Hash) ? data.with_indifferent_access : data
|
34
|
+
@channel = options[:channel]
|
35
|
+
@connection = options[:connection]
|
36
|
+
@namespace = validate_namespace options[:namespace]
|
33
37
|
end
|
34
38
|
|
35
39
|
def serialize
|
36
|
-
|
40
|
+
if is_channel?
|
41
|
+
[channel, encoded_name, data].to_json
|
42
|
+
else
|
43
|
+
[encoded_name, data].to_json
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def is_channel?
|
48
|
+
!@channel.nil?
|
37
49
|
end
|
38
50
|
|
39
51
|
private
|
@@ -41,7 +53,7 @@ module WebsocketRails
|
|
41
53
|
def validate_namespace(namespace)
|
42
54
|
namespace = [namespace] unless namespace.is_a?(Array)
|
43
55
|
namespace.unshift :global unless namespace.first == :global
|
44
|
-
|
56
|
+
namespace.map(&:to_sym) rescue [:global]
|
45
57
|
end
|
46
58
|
|
47
59
|
def encoded_name
|
@@ -56,15 +68,17 @@ module WebsocketRails
|
|
56
68
|
end
|
57
69
|
|
58
70
|
def self.decode(encoded_data)
|
59
|
-
message
|
60
|
-
|
61
|
-
|
71
|
+
message = JSON.parse( encoded_data )
|
72
|
+
|
73
|
+
channel_name = message.shift if message.size == 3
|
74
|
+
event_name = message[0]
|
75
|
+
data = message[1]
|
62
76
|
|
63
77
|
namespace = event_name.split('.')
|
64
78
|
event_name = namespace.pop
|
65
79
|
|
66
80
|
data['received'] = Time.now if data.is_a?(Hash)
|
67
|
-
[event_name,data,namespace]
|
81
|
+
[event_name, data, namespace, channel_name]
|
68
82
|
end
|
69
83
|
|
70
84
|
end
|
@@ -16,10 +16,10 @@ module WebsocketRails
|
|
16
16
|
# # located in config/initializers/events.rb
|
17
17
|
# WebsocketRails::EventMap.describe do
|
18
18
|
# subscribe :client_connected, to: ChatController, with_method: :client_connected
|
19
|
-
# subscribe :new_user, to
|
19
|
+
# subscribe :new_user, :to => ChatController, :with_method => :new_user
|
20
20
|
#
|
21
21
|
# namespace :product do
|
22
|
-
# subscribe :new, to
|
22
|
+
# subscribe :new, :to => ProductController, :with_method => :new
|
23
23
|
# end
|
24
24
|
# end
|
25
25
|
class EventMap
|
@@ -32,7 +32,8 @@ module WebsocketRails
|
|
32
32
|
|
33
33
|
def initialize(dispatcher)
|
34
34
|
@dispatcher = dispatcher
|
35
|
-
@namespace = DSL.new.evaluate WebsocketRails.route_block
|
35
|
+
@namespace = DSL.new(dispatcher).evaluate WebsocketRails.route_block
|
36
|
+
@namespace = DSL.new(dispatcher,@namespace).evaluate InternalEvents.events
|
36
37
|
end
|
37
38
|
|
38
39
|
def routes_for(event, &block)
|
@@ -41,10 +42,17 @@ module WebsocketRails
|
|
41
42
|
|
42
43
|
# Provides the DSL methods available to the Event routes file
|
43
44
|
class DSL
|
45
|
+
|
46
|
+
def initialize(dispatcher,namespace=nil)
|
47
|
+
if namespace
|
48
|
+
@namespace = namespace
|
49
|
+
else
|
50
|
+
@namespace = Namespace.new :global, dispatcher
|
51
|
+
end
|
52
|
+
end
|
44
53
|
|
45
|
-
def evaluate(route_block
|
46
|
-
|
47
|
-
instance_eval &route_block
|
54
|
+
def evaluate(route_block)
|
55
|
+
instance_eval &route_block unless route_block.nil?
|
48
56
|
@namespace
|
49
57
|
end
|
50
58
|
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class EventQueue
|
2
|
+
|
3
|
+
attr_reader :queue
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@queue = []
|
7
|
+
end
|
8
|
+
|
9
|
+
def enqueue(event)
|
10
|
+
@queue << event
|
11
|
+
end
|
12
|
+
alias :<< :enqueue
|
13
|
+
|
14
|
+
def last
|
15
|
+
@queue.last
|
16
|
+
end
|
17
|
+
|
18
|
+
def flush(&block)
|
19
|
+
unless block.nil?
|
20
|
+
@queue.each do |item|
|
21
|
+
block.call item
|
22
|
+
end
|
23
|
+
end
|
24
|
+
@queue = []
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module WebsocketRails
|
2
|
+
class InternalEvents
|
3
|
+
def self.events
|
4
|
+
Proc.new do
|
5
|
+
namespace :websocket_rails do
|
6
|
+
subscribe :subscribe, :to => InternalController, :with_method => :subscribe_to_channel
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class InternalController < BaseController
|
13
|
+
def subscribe_to_channel
|
14
|
+
puts "subscribed to: #{data[:channel]}"
|
15
|
+
channel_name = data[:channel]
|
16
|
+
WebsocketRails[channel_name].subscribe connection
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
WebsocketRails::EventMap.describe do
|
2
|
-
subscribe :client_connected, to
|
3
|
-
subscribe :new_message, to
|
4
|
-
subscribe :new_user, to
|
5
|
-
subscribe :change_username, to
|
6
|
-
subscribe :client_disconnected, to
|
2
|
+
subscribe :client_connected, :to => ChatController, :with_method => :client_connected
|
3
|
+
subscribe :new_message, :to => ChatController, :with_method => :new_message
|
4
|
+
subscribe :new_user, :to => ChatController, :with_method => :new_user
|
5
|
+
subscribe :change_username, :to => ChatController, :with_method => :change_username
|
6
|
+
subscribe :client_disconnected, :to => ChatController, :with_method => :delete_user
|
7
7
|
end
|
data/spec/dummy/log/test.log
CHANGED
@@ -452,3 +452,183 @@ Connecting to database specified by database.yml
|
|
452
452
|
Connecting to database specified by database.yml
|
453
453
|
Connecting to database specified by database.yml
|
454
454
|
Connecting to database specified by database.yml
|
455
|
+
Connecting to database specified by database.yml
|
456
|
+
Connecting to database specified by database.yml
|
457
|
+
Connecting to database specified by database.yml
|
458
|
+
Connecting to database specified by database.yml
|
459
|
+
Connecting to database specified by database.yml
|
460
|
+
Connecting to database specified by database.yml
|
461
|
+
Connecting to database specified by database.yml
|
462
|
+
Connecting to database specified by database.yml
|
463
|
+
Connecting to database specified by database.yml
|
464
|
+
Connecting to database specified by database.yml
|
465
|
+
Connecting to database specified by database.yml
|
466
|
+
Connecting to database specified by database.yml
|
467
|
+
Connecting to database specified by database.yml
|
468
|
+
Connecting to database specified by database.yml
|
469
|
+
Connecting to database specified by database.yml
|
470
|
+
Connecting to database specified by database.yml
|
471
|
+
Connecting to database specified by database.yml
|
472
|
+
Connecting to database specified by database.yml
|
473
|
+
Connecting to database specified by database.yml
|
474
|
+
Connecting to database specified by database.yml
|
475
|
+
Connecting to database specified by database.yml
|
476
|
+
Connecting to database specified by database.yml
|
477
|
+
Connecting to database specified by database.yml
|
478
|
+
Connecting to database specified by database.yml
|
479
|
+
Connecting to database specified by database.yml
|
480
|
+
Connecting to database specified by database.yml
|
481
|
+
Connecting to database specified by database.yml
|
482
|
+
Connecting to database specified by database.yml
|
483
|
+
Connecting to database specified by database.yml
|
484
|
+
Connecting to database specified by database.yml
|
485
|
+
Connecting to database specified by database.yml
|
486
|
+
Connecting to database specified by database.yml
|
487
|
+
Connecting to database specified by database.yml
|
488
|
+
Connecting to database specified by database.yml
|
489
|
+
Connecting to database specified by database.yml
|
490
|
+
Connecting to database specified by database.yml
|
491
|
+
Connecting to database specified by database.yml
|
492
|
+
Connecting to database specified by database.yml
|
493
|
+
Connecting to database specified by database.yml
|
494
|
+
Connecting to database specified by database.yml
|
495
|
+
Connecting to database specified by database.yml
|
496
|
+
Connecting to database specified by database.yml
|
497
|
+
Connecting to database specified by database.yml
|
498
|
+
Connecting to database specified by database.yml
|
499
|
+
Connecting to database specified by database.yml
|
500
|
+
Connecting to database specified by database.yml
|
501
|
+
Connecting to database specified by database.yml
|
502
|
+
Connecting to database specified by database.yml
|
503
|
+
Connecting to database specified by database.yml
|
504
|
+
Connecting to database specified by database.yml
|
505
|
+
Connecting to database specified by database.yml
|
506
|
+
Connecting to database specified by database.yml
|
507
|
+
Connecting to database specified by database.yml
|
508
|
+
Connecting to database specified by database.yml
|
509
|
+
Connecting to database specified by database.yml
|
510
|
+
Connecting to database specified by database.yml
|
511
|
+
Connecting to database specified by database.yml
|
512
|
+
Connecting to database specified by database.yml
|
513
|
+
Connecting to database specified by database.yml
|
514
|
+
Connecting to database specified by database.yml
|
515
|
+
Connecting to database specified by database.yml
|
516
|
+
Connecting to database specified by database.yml
|
517
|
+
Connecting to database specified by database.yml
|
518
|
+
Connecting to database specified by database.yml
|
519
|
+
Connecting to database specified by database.yml
|
520
|
+
Connecting to database specified by database.yml
|
521
|
+
Connecting to database specified by database.yml
|
522
|
+
Connecting to database specified by database.yml
|
523
|
+
Connecting to database specified by database.yml
|
524
|
+
Connecting to database specified by database.yml
|
525
|
+
Connecting to database specified by database.yml
|
526
|
+
Connecting to database specified by database.yml
|
527
|
+
Connecting to database specified by database.yml
|
528
|
+
Connecting to database specified by database.yml
|
529
|
+
Connecting to database specified by database.yml
|
530
|
+
Connecting to database specified by database.yml
|
531
|
+
Connecting to database specified by database.yml
|
532
|
+
Connecting to database specified by database.yml
|
533
|
+
Connecting to database specified by database.yml
|
534
|
+
Connecting to database specified by database.yml
|
535
|
+
Connecting to database specified by database.yml
|
536
|
+
Connecting to database specified by database.yml
|
537
|
+
Connecting to database specified by database.yml
|
538
|
+
Connecting to database specified by database.yml
|
539
|
+
Connecting to database specified by database.yml
|
540
|
+
Connecting to database specified by database.yml
|
541
|
+
Connecting to database specified by database.yml
|
542
|
+
Connecting to database specified by database.yml
|
543
|
+
Connecting to database specified by database.yml
|
544
|
+
Connecting to database specified by database.yml
|
545
|
+
Connecting to database specified by database.yml
|
546
|
+
Connecting to database specified by database.yml
|
547
|
+
Connecting to database specified by database.yml
|
548
|
+
Connecting to database specified by database.yml
|
549
|
+
Connecting to database specified by database.yml
|
550
|
+
Connecting to database specified by database.yml
|
551
|
+
Connecting to database specified by database.yml
|
552
|
+
Connecting to database specified by database.yml
|
553
|
+
Connecting to database specified by database.yml
|
554
|
+
Connecting to database specified by database.yml
|
555
|
+
Connecting to database specified by database.yml
|
556
|
+
Connecting to database specified by database.yml
|
557
|
+
Connecting to database specified by database.yml
|
558
|
+
Connecting to database specified by database.yml
|
559
|
+
Connecting to database specified by database.yml
|
560
|
+
Connecting to database specified by database.yml
|
561
|
+
Connecting to database specified by database.yml
|
562
|
+
Connecting to database specified by database.yml
|
563
|
+
Connecting to database specified by database.yml
|
564
|
+
Connecting to database specified by database.yml
|
565
|
+
Connecting to database specified by database.yml
|
566
|
+
Connecting to database specified by database.yml
|
567
|
+
Connecting to database specified by database.yml
|
568
|
+
Connecting to database specified by database.yml
|
569
|
+
Connecting to database specified by database.yml
|
570
|
+
Connecting to database specified by database.yml
|
571
|
+
Connecting to database specified by database.yml
|
572
|
+
Connecting to database specified by database.yml
|
573
|
+
Connecting to database specified by database.yml
|
574
|
+
Connecting to database specified by database.yml
|
575
|
+
Connecting to database specified by database.yml
|
576
|
+
Connecting to database specified by database.yml
|
577
|
+
Connecting to database specified by database.yml
|
578
|
+
Connecting to database specified by database.yml
|
579
|
+
Connecting to database specified by database.yml
|
580
|
+
Connecting to database specified by database.yml
|
581
|
+
Connecting to database specified by database.yml
|
582
|
+
Connecting to database specified by database.yml
|
583
|
+
Connecting to database specified by database.yml
|
584
|
+
Connecting to database specified by database.yml
|
585
|
+
Connecting to database specified by database.yml
|
586
|
+
Connecting to database specified by database.yml
|
587
|
+
Connecting to database specified by database.yml
|
588
|
+
Connecting to database specified by database.yml
|
589
|
+
Connecting to database specified by database.yml
|
590
|
+
Connecting to database specified by database.yml
|
591
|
+
Connecting to database specified by database.yml
|
592
|
+
Connecting to database specified by database.yml
|
593
|
+
Connecting to database specified by database.yml
|
594
|
+
Connecting to database specified by database.yml
|
595
|
+
Connecting to database specified by database.yml
|
596
|
+
Connecting to database specified by database.yml
|
597
|
+
Connecting to database specified by database.yml
|
598
|
+
Connecting to database specified by database.yml
|
599
|
+
Connecting to database specified by database.yml
|
600
|
+
Connecting to database specified by database.yml
|
601
|
+
Connecting to database specified by database.yml
|
602
|
+
Connecting to database specified by database.yml
|
603
|
+
Connecting to database specified by database.yml
|
604
|
+
Connecting to database specified by database.yml
|
605
|
+
Connecting to database specified by database.yml
|
606
|
+
Connecting to database specified by database.yml
|
607
|
+
Connecting to database specified by database.yml
|
608
|
+
Connecting to database specified by database.yml
|
609
|
+
Connecting to database specified by database.yml
|
610
|
+
Connecting to database specified by database.yml
|
611
|
+
Connecting to database specified by database.yml
|
612
|
+
Connecting to database specified by database.yml
|
613
|
+
Connecting to database specified by database.yml
|
614
|
+
Connecting to database specified by database.yml
|
615
|
+
Connecting to database specified by database.yml
|
616
|
+
Connecting to database specified by database.yml
|
617
|
+
Connecting to database specified by database.yml
|
618
|
+
Connecting to database specified by database.yml
|
619
|
+
Connecting to database specified by database.yml
|
620
|
+
Connecting to database specified by database.yml
|
621
|
+
Connecting to database specified by database.yml
|
622
|
+
Connecting to database specified by database.yml
|
623
|
+
Connecting to database specified by database.yml
|
624
|
+
Connecting to database specified by database.yml
|
625
|
+
Connecting to database specified by database.yml
|
626
|
+
Connecting to database specified by database.yml
|
627
|
+
Connecting to database specified by database.yml
|
628
|
+
Connecting to database specified by database.yml
|
629
|
+
Connecting to database specified by database.yml
|
630
|
+
Connecting to database specified by database.yml
|
631
|
+
Connecting to database specified by database.yml
|
632
|
+
Connecting to database specified by database.yml
|
633
|
+
Connecting to database specified by database.yml
|
634
|
+
Connecting to database specified by database.yml
|