入门 (Rails 6)
在此页面上
注意
本教程适用于 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 生成器创建应用程序框架。为此,第一步是安装 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 存储库:
git init . git add . git commit
按照本教程提交更改。
添加 Mongoid
1 。 修改Gemfile
以添加对 mongoid gem:
gem 'mongoid'
注意
需要 Mongoid 7.0.5或更高版本才能使用 Rails 6.0 。
安装 gem 依赖项:
bundle install
生成默认 Mongoid 配置:
bin/rails g mongoid:config
此生成器将创建 config/mongoid.yml
配置文件(用于配置与 MongoDB 部署的连接)和 config/initializers/mongoid.rb
初始值设定项文件(可用于其他与 Mongoid 相关的配置)。请注意,由于不使用 ActiveRecord,因此不会有 database.yml
文件。
在本地运行 MongoDB
在上一步中创建的配置适用于在本地运行 MongoDB 服务器的情况。如果还没有本地 MongoDB 服务器,请下载并安装 MongoDB。
虽然生成的 mongoid.yml
无需修改即可运行,但我们建议减少开发时的服务器选择超时。进行此更改后,mongoid.yml
的未注释行应如下所示:
development: clients: default: database: blog_development hosts: - localhost:27017 options: server_selection_timeout: 1
使用 MongoDB Atlas
您可以创建一个免费的 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 依赖项
如果这是您创建的第一个 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
关联:
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
:
class Comment include Mongoid::Document field :name, type: String field :message, type: String belongs_to :post end
打开后展示视图文件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
。 结果应如下所示:
<%= 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
创建一个包含以下内容的部分视图:
<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。
Dependencies
删除或注释掉Gemfile
中提到的任何 RDBMS 库,例如sqlite
、 pg
等,并添加mongoid
:
gem 'mongoid'
注意
需要 Mongoid 7.0.5或更高版本才能使用 Rails 6.0 。
安装 gem 依赖项:
bundle install
加载的框架
检查config/application.rb
。 如果它通过require 'rails/all'
要求使用 Rails 的所有组件,请将其更改为要求使用单独的框架:
# 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 一起使用。
ActiveRecord 配置
审核所有配置文件 (config/application.rb
, config/environments/{development,production.test}.rb
),并删除或注释掉对 config.active_record
和 config.active_storage
的任何引用。
停止 Spring
如果您的应用程序正在使用 Spring(这是 Rails 6上的默认设置),则必须在更改依赖项或配置后停止 Spring。
./bin/spring stop
注意
有时运行./bin/spring stop
会声称要停止 Spring,但实际上并没有停止。 在继续之前,请验证所有 Spring 进程是否已终止。
注意
有时,即使应用程序不包含 ActiveRecord 引用,Spring 也会尝试加载 ActiveRecord。 如果发生这种情况,请将 ActiveRecord 适配器依赖项(例如sqlite3
添加到Gemfile
中,以便完全加载 ActiveRecord,或者从应用程序删除Spring。
Mongoid 配置
生成默认 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 中可能如下所示:
class Post < ApplicationRecord has_many :comments, dependent: :destroy end
相同的模型在 Mongoid 中可能如下所示:
class Post include Mongoid::Document field :title, type: String field :body, type: String has_many :comments, dependent: :destroy end
或者,如果使用动态字段,则如下所示:
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 迁移指南和现代化指南。
Rails API
使用 Mongoid 创建 Rails API 应用程序的过程与创建常规应用程序的过程相同,唯一的变化是将 --api
参数更改为 rails new
。将 Rails API 应用程序迁移到 Mongoid 的过程与上述常规 Rails 应用程序的过程相同。
可以在 mongoid-demo GitHub 存储库中找到与本教程中描述的 Rails API 应用程序类似的完整应用程序。