Docs 菜单
Docs 主页
/ / /
Mongoid
/

入门 (Rails 6)

在此页面上

  • 新应用程序
  • 安装 rails
  • 创建新的应用程序
  • 创建 Git 存储库
  • 添加 Mongoid
  • 在本地运行 MongoDB
  • 使用 MongoDB Atlas
  • 其他 Rails 依赖项
  • 运行应用程序
  • 添加帖子
  • 添加评论
  • 现有应用程序
  • Dependencies
  • 加载的框架
  • ActiveRecord 配置
  • 停止 Spring
  • Mongoid 配置
  • 调整模型
  • 数据迁移
  • Rails API

注意

本教程适用于 Ruby on Rails 6 。 如果这不是您正在使用的版本,请从导航菜单中选择适合您的 Rails 版本的教程。

本部分介绍如何使用 Mongoid 创建新的 Ruby on Rails 应用程序进行数据访问。 该应用程序将类似于 Ruby on Rails 入门 中描述的博客应用程序 指南,但使用 Mongoid 而不是 ActiveRecord 作为数据库适配器。

此应用程序的完整源代码可以在 mongoid-demoGithub 存储库 中找到 。

注意

本指南假定您对 Ruby on Rails 有基本的了解。 要了解有关 Ruby on Rails 的更多信息,请参阅 入门指南 或其他 Rails 指南。

我们将使用 Rails 生成器创建应用程序框架。为此,第一步是安装 rails gem:

gem install rails -v '~> 6.0'

使用 rails 命令创建应用程序框架,如下所示:

rails new blog --skip-active-record --skip-bundle
cd blog

注意

您可能会收到如下警告:

Could not find gem 'puma (~> 3.11)' in any of the gem sources listed in your Gemfile.
Run `bundle install` to install missing gems.

请忽略它,因为我们稍后将负责 gem 安装。

我们传递--skip-active-record来请求不要将 ActiveRecord 添加为依赖项,因为我们将使用 Mongoid 代替。 此外,我们还传递了--skip-bundle ,因为我们将修改Gemfile以添加mongoid依赖项。

如果打算使用 RSpec 测试应用程序,则可以通过传递--skip-test--skip-system-test选项来指示生成器省略默认的 Rails 测试设置:

rails new blog --skip-bundle --skip-active-record --skip-test --skip-system-test
cd blog

虽然不是必需,但我们建议为您的应用程序创建一个 Git 存储库:

git init .
git add .
git commit

按照本教程提交更改。

1 。 修改Gemfile 以添加对 mongoid gem:

Gemfile
gem 'mongoid'

注意

需要 Mongoid 7.0.5或更高版本才能使用 Rails 6.0 。

  1. 安装 gem 依赖项:

bundle install
  1. 生成默认 Mongoid 配置:

bin/rails g mongoid:config

此生成器将创建 config/mongoid.yml 配置文件(用于配置与 MongoDB 部署的连接)和 config/initializers/mongoid.rb 初始值设定项文件(可用于其他与 Mongoid 相关的配置)。请注意,由于不使用 ActiveRecord,因此不会有 database.yml 文件。

在上一步中创建的配置适用于在本地运行 MongoDB 服务器的情况。如果还没有本地 MongoDB 服务器,请下载并安装 MongoDB

虽然生成的 mongoid.yml 无需修改即可运行,但我们建议减少开发时的服务器选择超时。进行此更改后,mongoid.yml 的未注释行应如下所示:

development:
clients:
default:
database: blog_development
hosts:
- localhost:27017
options:
server_selection_timeout: 1

您可以创建一个免费的 MongoDB Atlas 帐户并在 Atlas 中创建免费的 MongoDB 集群,而无需在本地下载、安装和运行 MongoDB。 创建集群后,请按照连接到集群页面中的说明获取 URI。 使用Ruby 驱动程序2.5或更高版本。

将 URI 粘贴到 config/mongoid.yml 文件中,并注释掉定义的主机。在使用 Atlas 时,我们建议将开发环境的服务器选择超时设置为 5 秒。

config/mongoid.yml 的未注释内容应如下所示:

development:
clients:
default:
uri: mongodb+srv://user:pass@yourcluster.mongodb.net/blog_development?retryWrites=true&w=majority
options:
server_selection_timeout: 5

如果这是您创建的第一个 Rails应用程序,则可能需要在计算机上安装 Node.js。 这可以通过操作系统包或 下载二进制文件 来完成

接下来,如果您尚未安装 Yarn,请 按照其安装说明进行操作

最后,安装 webpacker:

rails webpacker:install

现在,您可以通过运行以下命令启动应用程序服务器:

rails s

通过导航到 本地主机来访问应用程序:3000

通过使用标准 Rails 搭建,Mongoid 可以为我们的博客生成所需的模型、控制器和视图文件,以使我们可以快速开始创建博文:

bin/rails g scaffold Post title:string body:text

导航到 本地主机:3000 /posts 创建帖子并查看已创建的帖子。

新博客的屏幕截图

为了使应用程序更具交互性,增加用户对帖子添加评论的能力。

创建 Comment 模型:

bin/rails g scaffold Comment name:string message:string post:belongs_to

打开 Post 模型文件 app/models/post.rb,然后为注释添加 has_many 关联:

app/models/post.rb
class Post
include Mongoid::Document
field :title, type: String
field :body, type: String
has_many :comments, dependent: :destroy
end

注意

仅当使用 < 7.0.8或7.1.2的 Mongoid 版本时才需要以下内容 (请参阅 MONGOID- 4885 了解详细信息)

打开Comment模型文件app/models/comment.rb ,并将生成的embedded_in关联更改为belongs_to

应用/models/comment.rb
class Comment
include Mongoid::Document
field :name, type: String
field :message, type: String
belongs_to :post
end

打开后展示视图文件app/views/posts/show.html.erb ,并添加一个部分,用于呈现现有评论并提示留下新评论:

app/views/posts/show.html.erb
<section class="section comments">
<div class="container">
<h2 class="subtitle is-5">
<strong><%= @post.comments.count %></strong> Comments
</h2>
<%= render @post.comments %>
<div class="comment-form">
<hr />
<h3 class="subtitle is-3">Leave a reply</h3>
<%= render partial: 'comments/form', locals: { comment: @post.comments.build } %>
</div>
</div>
</section>

打开评论表单文件,将:message的字段类型从text_field更改为text_area ,并将:post_id的字段类型从text_field更改为hidden_field 。 结果应如下所示:

app/views/comments/_form.html.erb
<%= form_with(model: comment, local: true) do |form| %>
<% if comment.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(comment.errors.count, "error") %> prohibited this comment from being saved:</h2>
<ul>
<% comment.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= form.label :name %>
<%= form.text_field :name %>
</div>
<div class="field">
<%= form.label :message %>
<%= form.text_area :message %>
</div>
<div class="field">
<%= form.hidden_field :post_id %>
</div>
<div class="actions">
<%= form.submit %>
</div>
<% end %>

为评论视图app/views/comments/_comment.html.erb创建一个包含以下内容的部分视图:

app/views/comments/_comment.html.erb
<p>
<strong><%= comment.name %>:</strong>
<%= comment.message %>
<br>
<%= link_to 'Delete', [comment],
method: :delete,
class: "button is-danger",
data: { confirm: 'Are you sure?' } %>
</p>

现在您应该能够给帖子留下评论:

添加了新评论的博客屏幕截图

请按照以下步骤将现有Ruby on Rails应用程序切换为使用 Mongoid 而不是 ActiveRecord。

删除或注释掉Gemfile中提到的任何 RDBMS 库,例如sqlitepg等,并添加mongoid

Gemfile
gem 'mongoid'

注意

需要 Mongoid 7.0.5或更高版本才能使用 Rails 6.0 。

安装 gem 依赖项:

bundle install

检查config/application.rb 。 如果它通过require 'rails/all'要求使用 Rails 的所有组件,请将其更改为要求使用单独的框架:

config/application.rb
# Remove or comment out
#require "rails/all"
# Add this require instead of "rails/all":
require "rails"
# Pick the frameworks you want:
require "active_model/railtie"
require "active_job/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
# require "action_mailbox/engine"
# require "action_text/engine"
require "action_view/railtie"
require "action_cable/engine"
require "sprockets/railtie"
require "rails/test_unit/railtie"
# Remove or comment out ActiveRecord and ActiveStorage:
# require "active_record/railtie"
# require "active_storage/engine"

注意

目前,ActiveStorage 需要 ActiveRecord,并且无法与 Mongoid 一起使用。

审核所有配置文件 (config/application.rb, config/environments/{development,production.test}.rb),并删除或注释掉对 config.active_recordconfig.active_storage 的任何引用。

如果您的应用程序正在使用 Spring(这是 Rails 6上的默认设置),则必须在更改依赖项或配置后停止 Spring。

./bin/spring stop

注意

有时运行./bin/spring stop会声称要停止 Spring,但实际上并没有停止。 在继续之前,请验证所有 Spring 进程是否已终止。

注意

有时,即使应用程序不包含 ActiveRecord 引用,Spring 也会尝试加载 ActiveRecord。 如果发生这种情况,请将 ActiveRecord 适配器依赖项(例如sqlite3添加到Gemfile中,以便完全加载 ActiveRecord,或者从应用程序删除Spring。

生成默认 Mongoid 配置:

bin/rails g mongoid:config

此生成器将创建 config/mongoid.yml 配置文件(用于配置与 MongoDB 部署的连接)和 config/initializers/mongoid.rb 初始值设定项文件(可用于其他与 Mongoid 相关的配置)。通常,建议对所有 Mongoid 配置使用 mongoid.yml

查看本地运行 MongoDB使用 MongoDB Atlas部分,决定如何部署 MongoDB,并调整 Mongoid 配置 ( config/mongoid.yml ) 以进行匹配。

如果您的应用程序已有模型,从 ActiveRecord 迁移到 Mongoid 时则需要更改这些模型。

ActiveRecord 模型派生自 ApplicationRecord,没有列定义。Mongoid 模型一般没有超类,但必须包含 Mongoid::Document,并且通常会显式定义字段(但 动态字段 也可用于代替显式字段定义)。

例如,最基本的帖子模型在 ActiveRecord 中可能如下所示:

app/models/post.rb
class Post < ApplicationRecord
has_many :comments, dependent: :destroy
end

相同的模型在 Mongoid 中可能如下所示:

app/models/post.rb
class Post
include Mongoid::Document
field :title, type: String
field :body, type: String
has_many :comments, dependent: :destroy
end

或者,如果使用动态字段,则如下所示:

app/models/post.rb
class Post
include Mongoid::Document
include Mongoid::Attributes::Dynamic
has_many :comments, dependent: :destroy
end

Mongoid 不使用 ActiveRecord 迁移,因为 MongoDB 不要求在存储数据之前定义模式。

如果您希望将关系数据库中的已有数据转移到 MongoDB,则需要执行数据迁移。如上所述,不需要迁移架构,因为 MongoDB 不需要使用预定义的架构存储数据。

迁移工具通常特定于要迁移的数据,因为尽管 Mongoid 支持 ActiveRecord 关联超集,但对于 Mongoid 和 ActiveRecord 来说,在集合中存储模型引用的方式有所不同。话虽如此,MongoDB 提供了一些有关从 RDBMS 迁移到 MongoDB 的资源,例如 RDBMS 到 MongoDB 迁移指南现代化指南

使用 Mongoid 创建 Rails API 应用程序的过程与创建常规应用程序的过程相同,唯一的变化是将 --api 参数更改为 rails new。将 Rails API 应用程序迁移到 Mongoid 的过程与上述常规 Rails 应用程序的过程相同。

可以在 mongoid-demo GitHub 存储库中找到与本教程中描述的 Rails API 应用程序类似的完整应用程序。

后退

入门 (Rails 7)