Ruby on Rails

 

Ruby on Rails Tutorial: Understanding ActionCable and Real-Time Communication

In the era of dynamic web applications, real-time communication has become a vital feature. Whether you’re building a chat application, live notifications, or real-time updates, having the ability to push updates instantly to users without them needing to refresh the page enhances the user experience. Ruby on Rails simplifies real-time features with ActionCable, a framework that integrates WebSockets with your Rails application. In this blog, we’ll explore how to use ActionCable for real-time communication in Rails, covering setup, usage, and practical examples.

Ruby on Rails Tutorial: Understanding ActionCable and Real-Time Communication

 What is ActionCable?

ActionCable is a built-in Rails framework that facilitates real-time communication between the server and the client. It allows you to create WebSocket connections and handle real-time data transmission efficiently within a Rails application. ActionCable combines the power of WebSockets with the robustness of Rails, making it easy to implement live updates and interactive features.

Setting Up ActionCable

To get started with ActionCable, ensure you have a Rails application running. The setup process involves configuring the necessary files and starting the ActionCable server.

Configuration

First, ensure that your Rails application has ActionCable enabled. If you’re starting a new project, it’s typically enabled by default. However, for existing projects, you may need to update your configuration.

  1. Enable ActionCable in Your Rails Application:

   In `config/application.rb`, ensure that the ActionCable framework is included:

```ruby
require "action_cable/engine"
```
  1. Set Up the Cable Configuration:

   In `config/cable.yml`, you can configure the ActionCable server. For example:

```yaml
development:
  adapter: async

production:
  adapter: redis
  url: redis://localhost:6379/1
  channel_prefix: my_app_production
```

   This example uses the `async` adapter for development and the `redis` adapter for production.

Creating Channels

Channels in ActionCable are equivalent to controllers in Rails MVC. They manage the WebSocket connections and handle data broadcasting.

  •  Generating a Channel

To create a new channel, use the Rails generator:

```bash
rails generate channel Chat
```

This command creates two files:

– `app/channels/chat_channel.rb`

– `app/javascript/channels/chat_channel.js`

  •  Implementing the Channel

In `app/channels/chat_channel.rb`, define the actions for the channel:

```ruby
 app/channels/chat_channel.rb
class ChatChannel < ApplicationCable::Channel
  def subscribed
    stream_from "chat_{params[:room]}"
  end

  def unsubscribed
     Any cleanup needed when channel is unsubscribed
  end

  def speak(data)
    ActionCable.server.broadcast "chat_{params[:room]}", message: data['message']
  end
end
```

This example sets up a chat channel where users subscribe to a specific room. The `speak` action broadcasts messages to all users subscribed to the room.

Client-Side Integration

The client-side integration is essential for making WebSocket connections and handling real-time updates in the browser.

JavaScript Channel Subscription

In `app/javascript/channels/chat_channel.js`, subscribe to the channel and handle incoming data:

```javascript
import consumer from "./consumer"

consumer.subscriptions.create({ channel: "ChatChannel", room: "public" }, {
  connected() {
    console.log("Connected to the chat room!");
  },

  disconnected() {
    console.log("Disconnected from the chat room!");
  },

  received(data) {
    console.log("Received:", data.message);
    const messages = document.getElementById('messages');
    messages.insertAdjacentHTML('beforeend', `<p>${data.message}</p>`);
  },

  speak(message) {
    this.perform('speak', { message: message });
  }
});

// Example usage: Sending a message
document.getElementById('send').addEventListener('click', () => {
  const messageInput = document.getElementById('message_input');
  consumer.subscriptions.subscriptions[0].speak(messageInput.value);
  messageInput.value = '';
});
```

This code connects to the `ChatChannel`, listens for incoming messages, and appends them to the page. It also allows users to send messages through the WebSocket connection.

Testing and Deployment

  • Testing Locally

To test the setup locally, start your Rails server and visit the page where the chat functionality is integrated. Open multiple browser windows to simulate different users and test real-time communication.

  • Deployment Considerations

For production, ensure you have a robust setup, typically using Redis as the adapter and a proper WebSocket server like ActionCable or a dedicated WebSocket server. Additionally, ensure that your deployment environment supports WebSockets.

Conclusion

ActionCable provides a powerful and straightforward way to implement real-time features in Ruby on Rails applications. By following the steps outlined in this blog, you can set up WebSocket connections, create channels, and manage real-time data flow between the server and the client. Whether you’re building a chat app, live notifications, or collaborative tools, ActionCable can significantly enhance the interactivity and responsiveness of your web applications.

 Further Reading

  1. Rails Guides: ActionCable 
  2. ActionCable on GitHub
  3. Building a Real-Time Chat App with Rails and ActionCable
Previously at
Flag Argentina
Brazil
time icon
GMT-3
Senior Software Engineer with a focus on remote work. Proficient in Ruby on Rails. Expertise spans y6ears in Ruby on Rails development, contributing to B2C financial solutions and data engineering.