使用Ruby on Rails和Action Cable构建实时聊天应用程序

数字化生活设计师 2021-02-21 ⋅ 14 阅读

在今天的博客中,我们将使用Ruby on Rails和Action Cable构建一个实时聊天应用程序。Action Cable是Rails中的一个组件,它允许我们在Web应用程序中使用实时功能。我们将使用Rails 5及以上版本,因为Action Cable是在这个版本中引入的。

准备工作

首先,确保你的机器上已经安装了Ruby和Rails。你可以通过运行以下命令来检查它们是否已经安装:

ruby -v
rails -v

如果它们已经安装,你将会看到它们的版本号。

接下来,我们需要创建一个新的Rails应用程序。在命令行中运行以下命令:

rails new chat_app

然后,进入应用程序的目录:

cd chat_app

接下来,我们需要创建一个具有用户名和内容的消息模型。在命令行中运行以下命令:

rails generate model Message user:string content:text

然后,运行数据库迁移:

rails db:migrate

现在,我们已经准备好开始构建我们的实时聊天应用程序了!

配置Action Cable

为了使用Action Cable,我们需要配置它。打开config/cable.yml的文件,并确保以下代码位于文件中:

development:
  adapter: async

test:
  adapter: async

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

这将设置Action Cable在开发和测试环境中使用async适配器,在生产环境中使用Redis适配器。

接下来,我们需要添加一个WebSocket服务器。在config/environments/development.rb中找到以下行:

# config.action_cable.url = 'ws://cable.example.com/cable'

并将其取消注释,并将其修改为:

config.action_cable.url = "ws://localhost:3000/cable"

这将设置WebSocket服务器的URL。

创建Action Cable通道和工作器

为了让Action Cable工作,我们需要创建一个通道和一个后台工作器。

首先,我们将创建一个名为ChatChannel的通道。在命令行中运行以下命令:

rails generate channel Chat

这将生成一个名为chat_channel.rb的文件。打开它,并在ChatChannel类中添加以下代码:

class ChatChannel < ApplicationCable::Channel
  def subscribed
    stream_from "chat_channel"
  end

  def unsubscribed
    # Any cleanup needed when channel is unsubscribed
  end

  def send_message(data)
    Message.create(user: data['user'], content: data['content'])
  end
end

subscribed方法用于订阅一个通道,unsubscribed方法用于取消订阅。send_message方法用于创建一个新的消息并将其保存到数据库中。

然后,我们需要创建一个名为MessageBroadcastJob的工作器。在命令行中运行以下命令:

rails generate job MessageBroadcast

这将生成一个名为message_broadcast_job.rb的文件。打开它,并添加以下代码:

class MessageBroadcastJob < ApplicationJob
  queue_as :default

  def perform(message)
    ActionCable.server.broadcast('chat_channel', message: render_message(message))
  end

  private

  def render_message(message)
    ApplicationController.renderer.render(partial: 'messages/message', locals: { message: message })
  end
end

这个工作器的工作是使用Action Cable将消息广播到所有订阅了chat_channel通道的客户端。

创建聊天界面

现在我们可以开始创建我们的聊天界面了。

首先,我们将在config/routes.rb文件中添加聊天路由。在文件末尾添加以下代码:

Rails.application.routes.draw do
  resources :messages

  mount ActionCable.server => '/cable'
end

然后,我们将创建一个新的消息控制器。在命令行中运行以下命令:

rails generate controller Messages

然后,打开app/controllers/messages_controller.rb文件,并用以下代码替换它:

class MessagesController < ApplicationController
  def create
    @message = Message.new(message_params)

    respond_to do |format|
      if @message.save
        format.html { redirect_to messages_url, notice: 'Message was successfully created.' }
        format.json { render :show, status: :created, location: @message }
      else
        format.html { render :new }
        format.json { render json: @message.errors, status: :unprocessable_entity }
      end
    end
  end

  private

  def message_params
    params.require(:message).permit(:user, :content)
  end
end

这个控制器的工作是创建和保存新的消息。

接下来,我们将创建新的消息视图。在app/views/messages目录下,创建一个名为_message.html.erb的文件,并添加以下代码:

<p>
  <strong><%= message.user %>:</strong>
  <%= message.content %>
</p>

然后,创建一个名为index.html.erb的文件,并添加以下代码:

<h1>Chat</h1>

<% @messages.each do |message| %>
  <%= render 'message', message: message %>
<% end %>

<%= form_with(model: Message.new, url: messages_path, method: :post, data: { remote: true }) do |form| %>
  <div class="field">
    <%= form.label :user %>
    <%= form.text_field :user %>
  </div>

  <div class="field">
    <%= form.label :content %>
    <%= form.text_area :content %>
  </div>

  <div class="actions">
    <%= form.submit 'Send' %>
  </div>
<% end %>

最后,打开app/views/layouts/application.html.erb文件,并添加以下代码:

<!DOCTYPE html>
<html>
  <head>
    <title>Chat</title>
    <%= csrf_meta_tags %>
    <%= action_cable_meta_tag %>
  </head>
  <body>
    <%= yield %>
    <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
  </body>
</html>

这将添加Action Cable所需的JavaScript标签。

测试应用程序

现在我们已经完成了应用程序的开发,我们可以测试它了。

首先,启动服务器:

rails server

然后,打开浏览器并访问http://localhost:3000/messages。你将看到一个简单的聊天界面。

现在,你可以在输入框中输入你的用户名和消息,并点击发送。你应该可以看到你的消息出现在聊天界面上,并且其他聊天应用程序的客户端也会实时收到该消息。

你已经成功构建了一个实时聊天应用程序!如果你想进一步扩展它,你可以添加一些额外的功能,例如用户身份验证和更复杂的消息处理。

希望你喜欢这篇博客,并对使用Ruby on Rails和Action Cable构建实时聊天应用程序有了更深入的了解。谢谢阅读!


全部评论: 0

    我有话说: