12/08/2018, 15:07

Action Cable "Hello World" trong rails 5.1

Chào tất cả mọi người, Action Cable chắc cũng khá quen thuộc đối với những lập trình viên ruby on rails từ khi Rails 5 được phát hành. Hầu hết chúng ta đều tìm thấy những ví dụ về ActionCable qua ứng dụng chat online, nhưng tôi thấy nó khá là lớn để giúp cho những người mới tiếp cận có thể hiểu ...

Chào tất cả mọi người, Action Cable chắc cũng khá quen thuộc đối với những lập trình viên ruby on rails từ khi Rails 5 được phát hành. Hầu hết chúng ta đều tìm thấy những ví dụ về ActionCable qua ứng dụng chat online, nhưng tôi thấy nó khá là lớn để giúp cho những người mới tiếp cận có thể hiểu được nhanh chóng. Trong bài viết này, tôi sẽ hướng dẫn các bạn làm một ứng dụng nhỏ, đơn giản giúp các bạn có thể dễ dàng hiểu được về cách thức hoạt động của Action Cable trong rails 5.1 (đây là phiên bản mới nhất của Rails tính đến thời điểm hiện tại, và ActionCable không có thay đổi nhiều so với Rails 5).

Tạo một ứng dụng rails

rails new hello-world-action-cable
cd hello-world-action-cable

Bây giờ thì tạo một controller để hiển thị trang web.

rails generate controller page index

Sửa một chút ở file config/routes.rb

Rails.application.routes.draw do
  get ‘page/index’
  root ‘page#index’
end

Thêm một đoạn html đơn giản ở view app/views/page/index.html.erb

<h1>Action Cable Example</h1>

<p id=”messages”></p>

Để chúng ta có thể sử dụng được jquery trong ứng dụng này thì phải thêm gem jquery-rails vào trong Gemfile, bởi vì thư viện này đã bị loại bỏ khỏi rails 5.1, không tích hợp từ đầu như những phiên bản trước

gem "jquery-rails"

Tiếp theo là thêm //= require jquery vào app/assets/javascripts/application.js

//= require rails-ujs
//= require jquery
//= require turbolinks
//= require_tree 

Tạo một channel mới

Chúng ta chỉ cần vào terminal gõ

$ rails generate channel WebNotifications
create  app/channels/web_notifications_channel.rb
identical  app/assets/javascripts/cable.js
create  app/assets/javascripts/channels/web_notifications.coffee

Một số file sẽ tự động generate ra mà không cần phải tạo bằng tay.

Tiếp theo chúng ta thêm đoạn code javascript vào file app/assets/javascripts/page.coffee

App.room = App.cable.subscriptions.create "WebNotificationsChannel",
    connected: ->
    # Called when the subscription is ready for use on the server

    disconnected: ->
    # Called when the subscription has been terminated by the server

    received: (data) ->
      $('#message').text data['message']

Cuối cùng, chúng ta sửa lại file app/channels/web_notifications_channel.rb như sau:

class WebNotificationsChannel < ApplicationCable::Channel
  def subscribed
    stream_from "notification_channel"
  end

  def unsubscribed
    # Any cleanup needed when channel is unsubscribed
  end
end

Thật đáng tiếc là ứng dụng vẫn chưa chạy được từ rails c, bởi vì nó nằm ở terminal khác so với rails server. Để có thể thực hiện được, ta thêm gem redis vào Gemfile. Bundle lại thôi nào!.

Tiếp theo, bạn phải chỉnh sửa lại file config/cable.yml như sau để redis có thể chạy được ở local:

redis: &redis
  adapter: redis
  url: redis://localhost:6379/1

production: *redis
development: *redis
test: *redis

Và giờ phút quan trọng nhất đã đến, restart server lại và xem thành quả mình đã làm nào! Bạn đã vào trang chính rồi chứ? Bây giờ bật rails c lên và gõ cái này vào nhé.

ActionCable.server.broadcast "notification_channel", message: "Hello World!"

Đây là lệnh để broadcast dữ liệu từ server đến client theo channel "notification_channel" và ta vừa khai báo stream_from "notification_channel" ở phía trên. Bạn đã thấy thành quả của mình chứ?

Bài viết đến đây là kết thúc, cám ơn mọi người đã theo dõi!             </div>
            
            <div class=

0