Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs 菜单
Docs 主页
/ /

将 Mongoid 与 Sinatra 集成

在本指南中,您可以学习;了解如何创建使用 Sinatra 作为 Web框架的 Mongoid Web应用程序。Sinatra 是一种领域特定语言(DSL),用于在Ruby中创建 Web 应用程序。Sinatra 应用程序设立简单,并且可以提供比其他框架更快的请求处理。

本教程中的应用程序由以下各层组成:

  • 数据库层:MongoDB提供数据存储和检索。

  • 应用程序层:Sinatra 处理HTTP请求、路由和逻辑处理。

  • 表示层:嵌入式Ruby模板在网页上渲染餐厅数据。

提示

要学习;了解如何将 Mongoid 集成到现有应用程序中,请参阅 Add Mongoid to an Existing Application(将 Mongoid 添加到现有应用程序)指南。

通过将MongoDB与 Mongoid 和 Sinatra 集成,您可以使用 Mongoid 的对象文档映射器 (ODM) 与 MongoDB 灵活的 document model 进行交互。Mongoid 提供了 Rails 的 Active Record ORM 的轻量级替代方案,您可以利用 MongoDB 的模式灵活性,同时使用 Sinatra 的极简方法轻松控制数据的建模和显示方式。

本教程向您展示如何构建使用Ruby和 Sinatra 的 Web应用程序。该应用程序访问示例餐厅数据,查询数据,并在本地托管站点上显示结果。本教程还包括有关连接到MongoDB Atlas上托管的MongoDB 集群以及访问和显示数据库数据的说明。

按照本节中的步骤安装项目依赖项,创建Atlas集群,并设立应用程序结构。

1

在创建快速入门应用程序之前,请在开发环境中安装以下软件:

先决条件
注意

Ruby

使用 3.1 或更高版本。

这是Ruby的包管理器。

代码编辑器

使用您选择的代码编辑器。

终端应用和shell

对于 MacOS 用户,请使用终端或类似应用程序。对于 Windows 用户,请使用 PowerShell。

2

MongoDB Atlas是一项完全托管云数据库服务,用于托管MongoDB部署。如果您没有MongoDB 部署,可以通过完成MongoDB入门教程来免费创建MongoDB 集群。 MongoDB入门教程还演示了如何将示例数据集加载到集群中,包括本教程中使用的sample_restaurants 数据库。

要连接到MongoDB集群,您必须使用连接 URI。学习如何检索连接 URI,请参阅MongoDB入门教程的添加连接字符串部分。

重要

将连接string保存在安全位置。

3

连接Atlas 集群时,必须在连接字符串中将要与之交互的数据库指定为默认数据库。必须将数据库名称添加到连接字符串中主机名之后连接选项之前

以下示例在示例连接字符串中指定了 sample_restaurants 目标数据库:

mongodb+srv://user0:pass123@mongo0.example.com/sample_restaurants?retryWrites=true&w=majority

示例连接字符串在 mongo0.example.com 主机名之后、retryWritesw 连接选项之前包含数据库。

4

运行以下命令,创建名为 my-sinatra-app 的新应用程序目录并导航到该目录:

mkdir my-sinatra-app
cd my-sinatra-app
5

所有Ruby应用程序都必须具有列出所需 gem 的 Gemfile。 运行以下命令,在应用程序中创建 Gemfile

touch Gemfile

然后,运行以下命令将所需的 gem 添加到 Gemfile 中并进行安装:

bundle add mongoid sinatra rackup webrick
bundle install

设置项目结构和依赖项后,请按照本节中的步骤连接到MongoDB并设立数据模型。

1

my-sinatra-app目录中,创建 config 子目录。然后,在此子目录中创建一个名为 mongoid.yml 的文件。

将以下代码粘贴到mongoid.yml文件:

my-sinatra-app/config/mongoid.yml
development:
clients:
default:
uri: <connection string>

<connection string> 占位符替换为您在上一步中保存的连接 URI。确保 URI 包含 sample_restaurants数据库名称。

2

my-sinatra-app目录中,创建一个名为 app.rb 的文件。将以下内容粘贴到 app.rb文件中,以加载必要的 gem 和配置文件:

my-sinatra-app/ 应用.rb
require 'sinatra'
require 'mongoid'
Mongoid.load!(File.join(File.dirname(__FILE__), 'config', 'mongoid.yml'))
3

app.rb文件中,通过添加以下代码来创建名为 Restaurant 的模型:

my-sinatra-app/ 应用.rb
class Restaurant
include Mongoid::Document
field :name, type: String
field :cuisine, type: String
field :borough, type: String
end

Restaurant 模型表示 sample_restaurants数据库中的 restaurants集合。它定义了 namecuisineborough 字段来存储餐厅数据。

4

app.rb文件中,添加以下路由以显示餐厅数据:

my-sinatra-app/ 应用.rb
get '/' do
@restaurants = Restaurant.all
erb :index
end
get '/browse' do
@restaurants = Restaurant
.where(name: /Moon/i).and(borough: "Queens")
erb :browse
end

/ 路由显示所有餐厅,而 /browse 路由使用不区分大小写匹配项查询名称中包含 "Moon" 的皇后区餐厅。

设置数据层后,请按照本节中的步骤为用户界面创建模板。

1

my-sinatra-app目录中,创建一个名为 views 的子目录。

然后,在 views 子目录中创建一个名为 layout.erb 的文件并粘贴以下代码:

my-sinatra-app/views/layout.erb
<!DOCTYPE html>
<html>
<head>
<title>Restaurant Directory</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 20px;
background-color: #a8d5ba;
}
.header {
text-align: center;
margin-bottom: 30px;
}
.nav {
text-align: center;
margin-bottom: 20px;
}
.nav a {
text-decoration: none;
color: #6a9bd2;
margin: 0 10px;
font-size: 16px;
}
.container {
max-width: 1200px;
margin: 0 auto;
background: white;
padding: 20px;
border-radius: 10px;
}
.restaurant-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 20px;
margin-top: 20px;
}
.restaurant-card {
background: #f8f9fa;
padding: 20px;
border-radius: 8px;
border: 1px solid #ddd;
}
.restaurant-card h3 {
margin-top: 0;
color: #333;
}
.cuisine-tag {
background: #4a9d5f;
color: white;
padding: 4px 8px;
border-radius: 4px;
font-size: 12px;
display: inline-block;
}
</style>
</head>
<body>
<div class="header">
<h1>Restaurant Directory</h1>
</div>
<div class="nav">
<a href="/">All Restaurants</a>
<a href="/browse">Browse Filtered Restaurants</a>
</div>
<div class="container">
<%= yield %>
</div>
</body>
</html>

此文件是嵌入式Ruby (ERB) 模板。这些模板包括带有嵌入式Ruby代码的 HTML,用于生成动态 HTML 内容。

2

views 子目录中,创建名为 index.erb 的文件并粘贴以下代码:

my-sinatra-app/views/ 索引
<h2>All Restaurants</h2>
<p>Total restaurants: <%= @restaurants.count %></p>
<div class="restaurant-grid">
<% @restaurants.each do |restaurant| %>
<div class="restaurant-card">
<h3><%= restaurant.name %></h3>
<p><strong>Borough:</strong> <%= restaurant.borough %></p>
<span class="cuisine-tag"><%= restaurant.cuisine %></span>
</div>
<% end %>
</div>

此视图文件在应用程序用户界面中以网格布局显示所有餐厅。

3

views 子目录中,创建名为 browse.erb 的文件并粘贴以下代码:

my-sinatra-app/views/browse.erb
<h2>Browse Restaurants</h2>
<p>Restaurants in Queens with "Moon" in the name</p>
<h3>Filtered Results</h3>
<div class="restaurant-grid">
<% @restaurants.each do |restaurant| %>
<div class="restaurant-card">
<h3><%= restaurant.name %></h3>
<p><strong>Borough:</strong> <%= restaurant.borough %></p>
<span class="cuisine-tag"><%= restaurant.cuisine %></span>
</div>
<% end %>
</div>

此视图文件显示自定义 browse 路线中的餐厅,该路线筛选出位于皇后区且名称中包含 "Moon" 的餐厅。

最后,按照本节中的步骤运行Web应用程序并使用浏览器界面探索餐厅数据。

1

导航到项目目录并运行以下命令:

bundle exec ruby app.rb

此命令在端口 4567(Sinatra 的默认端口)上启动 Web服务器。如果成功,命令输出将类似于以下示例:

[2024-10-01 12:36:49] INFO WEBrick 1.8.2
[2024-10-01 12:36:49] INFO ruby 3.2.5 (2024-07-26) [arm64-darwin23]
== Sinatra (v4.0.0) has taken the stage on 4567 for development with backup from WEBrick
[2024-10-01 12:36:49] INFO WEBrick::HTTPServer#start: pid=79176 port=4567
2

在网络浏览器中打开http://localhost:4567。初始登陆页面按照数据库中出现的顺序显示 sample_restaurants.restaurants集合中的所有餐厅:

显示所有餐厅的网页

然后,单击 Browse Filtered Restaurants 链接查看皇后区名称中包含 "Moon" 的餐厅:

显示过滤器的餐厅的网页

恭喜您完成 Sinatra 快速入门教程!完成这些步骤后,您就有了一个Ruby和 Sinatra Web应用程序,它连接到MongoDB 部署,对示例餐厅数据运行查询,并在本地托管的 Web 界面上显示结果。

要学习;了解有关Ruby、Sinatra、Mongoid 和MongoDB的更多信息,请查看以下资源:

  • Sinatra 文档

  • Ruby驱动程序文档

  • Ruby语言文档

  • 对数据进行建模:了解如何自定义 Mongoid 模型。

  • 与数据交互:了解如何使用 Mongoid 模型与MongoDB数据交互。

提示

其他框架教程

如果您更愿意使用 Rails 作为 Web框架,请参阅将 Mongoid 与 Ruby on Rails 集成指南。

后退

入门: Ruby on Rails

在此页面上