Biweekly Lecture
2015-07-28
Ruby on Rails Korea
What is ActionCable:
source 'https://rubygems.org'
gem 'rails', '4.2.3'
gem 'actioncable', github: 'rails/actioncable'
gem 'sqlite3'
gem 'coffee-rails', '~> 4.1.0'
gem 'jquery-rails'
gem 'turbolinks'
gem 'puma'
gem 'uglifier', '>= 1.3.0'
group :development, :test do
gem 'byebug'
gem 'spring'
gem 'web-console', '~> 2.0'
end# app/controllers/sessions_controller.rb
class SessionsController < ApplicationController
def create
cookies.signed[:username] = params[:session][:username]
redirect_to messages_path
end
end<%= form_for :session, url: sessions_path do |f| %>
<%= f.label :username, 'Enter a username' %><br/>
<%= f.text_field :username %><br/>
<%= f.submit 'Start chatting' %>
<% end %>class MessagesController < ApplicationController
def create
head :ok
end
endSigned in as @<%= cookies.signed[:username] %>.
<br/><br/>
<div id='messages'></div>
<br/><br/>
<%= form_for :message, url: messages_path, remote: true, id: 'messages-form' do |f| %>
<%= f.label :body, 'Enter a message:' %><br/>
<%= f.text_field :body %><br/>
<%= f.submit 'Send message' %>
<% end %>레일스 프로젝트에 사용자 직접 만들어야 하는 파일
# app/channels/application_cable/connection.rb
module ApplicationCable
class Connection < ActionCable::Connection::Base
end
end
# app/channels/application_cable/channel.rb
module ApplicationCable
class Channel < ActionCable::Channel::Base
end
endlocal: &local
:url: redis://localhost:6379
:host: localhost
:port: 6379
:timeout: 1
:inline: true
development: *local
test: *local# cable/config.ru
require ::File.expand_path('../../config/environment', __FILE__)
Rails.application.eager_load!
require 'action_cable/process/logging'
run ActionCable.server# /bin/bash
bundle exec puma -p 28080 cable/config.ru# app/channels/messages_channel.rb
class MessagesChannel < ApplicationCable::Channel
def subscribed
stream_from 'messages'
end
end레일스 프로젝트에 사용자 직접 만들어야 하는 파일
class MessagesController < ApplicationController
def create
ActionCable.server.broadcast 'messages',
message: params[:message][:body],
username: cookies.signed[:username]
head :ok
end
end# app/assets/javascripts/channels/index.coffee
#= require cable
#= require_self
#= require_tree .
@App = {}
App.cable = Cable.createConsumer 'ws://127.0.0.1:28080'# app/assets/javascripts/channels/index.coffee
App.messages = App.cable.subscriptions.create 'MessagesChannel',
received: (data) ->
$('#messages').append @renderMessage(data)
renderMessage: (data) ->
"<p><b>[#{data.username}]:</b> #{data.message}</p>"레일스 5버전으로 만든 액션 케이블 예시 소스(니딘베칼)
https://github.com/nithinbekal/actioncable-chat-example
레일스 5 를 사용할 경우 젬 파일 구성
https://github.com/nithinbekal/actioncable-chat-example/blob/f0f4c7269c0c491576fd23db4fd11c09ebe69f54/Gemfile
액션케이블 소스 저장소
https://github.com/rails/actioncable
레일스 개발 팀이 공개한 액션 케이블 예시
https://github.com/rails/actioncable-examples
고 레일스(동영상) 레일스 개발팀의 액션 케이블 예시를 설명
https://gorails.com/episodes/rails-5-actioncable-websockets
래피드파이어(설문조사) 관련 액션케이블 예시
https://github.com/code-mancers/rapidfire-demo/compare/actioncable