在今天的博客中,我们将使用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构建实时聊天应用程序有了更深入的了解。谢谢阅读!
本文来自极简博客,作者:数字化生活设计师,转载请注明原文链接:使用Ruby on Rails和Action Cable构建实时聊天应用程序