如何在没有数据库的情况下配置Ruby on Rails?

114

对于一个目前不需要数据库的小型网站项目,使用Ruby on Rails将非常方便。我知道我可以在MySQL中创建一个空数据库并从那里开始,但是有没有人知道更好的方法在没有数据库的情况下运行Rails?

谢谢

6个回答

120

对于 Rails 3Rails 4

使用 -O(大写 'O') 或 --skip-activerecord 选项生成一个没有数据库的应用程序。

rails new myApp -O

或者

rails new myApp --skip-activerecord

本回答内容源自此处


对于 Rails 5:

使用 --skip-active-record 选项生成一个没有数据库的应用程序

注意与以前版本不同,多了一个连字符 '-'.

rails new myApp --skip-active-record


2
是的,这适用于Rails 4 :) - 已验证。如果你想放弃测试单元,请使用:rails new myApp-O --skip-bundle -T - Chris Hough
1
如果你从零开始,这绝对是最简单的方法,但要注意(至少在Rails 4.0.1中),该命令中active和record之间有一个“-”。因此,它应该写成:rails new myApp --skip-active-record。 - Nic Benders
1
我刚刚遇到了这个问题并注意到,对于Rails 4.2.x版本,只有-O选项有效。而选项--skip-activerecord无效。 - Nazar Hussain
这也适用于Rails-API:rails new myApp -O。谢谢。 - Abel
2
如果有人想知道,在Rails 5中是 --skip-active-record(请注意active和record之间的破折号)。另一种方式对我不起作用。 - audiodude
对于 Rails 7,使用 rails new myApp -O 命令创建新应用。 - antonkronaj

67
对于新项目,使用简单的rails new your_app --skip-active-record即可,但对于现有的Rails 4-7项目,在您的config/application.rb文件中,您需要添加以下行:
require 'rails/all' # or `require "rails"' in newer versions

(这一行的参考是正在加载 this file
所以,你必须单独加载每个库,而不是全部加载,如下所示:

# active_record is what we're not going to use it, so add it comment in case 
# at some point you enable it back again
# require "active_record/railtie" 

# This is not loaded in rails/all but inside active_record so add it if
# you want your models work as expected
require "active_model/railtie" 
# And now the rest
require "action_controller/railtie"
require "action_mailer/railtie"
require "action_view/railtie"
require "active_job/railtie" # Only for Rails >= 4.2
require "action_cable/engine" # Only for Rails >= 5.0
require "sprockets/railtie" # Deprecated for Rails >= 7, so add it only if you're using it
require "rails/test_unit/railtie"

# All these depend on active_record, so they should be excluded also
# require "action_text/engine" # Only for Rails >= 6.0
# require "action_mailbox/engine" # Only for Rails >= 6.0
# require "active_storage/engine" # Only for Rails >= 5.2

请关注评论,了解有关你的Rails版本要加载哪些内容。此外,请检查以下文件(如果您有这些文件),并注释以下行:
# package.json
"@rails/activestorage": "^6.0.0",

# app/javascript/packs/application.js
require("@rails/activestorage").start()

# bin/setup
system! 'bin/rails db:prepare'

# config/environments/development.rb
config.active_storage.service = :local # For Rails >= 5.2
config.active_record.migration_error = :page_load
config.active_record.verbose_query_logs = true

# config/environments/test.rb
config.active_storage.service = :test # For Rails >= 5.2

# config/environments/production.rb
config.active_storage.service = :local # For Rails >= 5.2
config.active_record.dump_schema_after_migration = false

# spec/rails_helper.rb
ActiveRecord::Migration.maintain_test_schema!

# test/test_helper.rb
fixtures :all # In case you're using fixtures

# Only for Rails >= 5.0
#config/initializers/new_framework_defaults.rb
Rails.application.config.active_record.belongs_to_required_by_default = true

同时在您的模型文件中删除任何对 ActiveRecord::Base 的引用(或者如果适用,直接删除这些文件)。例如,自动生成的app/models/application_record.rb文件。


2
对于Rails 5,您可能还需要要求active_job/railtieaction_cable/engine - Ingmaras Keleras
2
database.yml 中,难道没有一个虚拟的 DB 适配器可以使用,以便它只是忽略掉数据库吗? - Chloe
4
activerecord-nulldb-adapter 是从 https://github.com/nulldb/nulldb 获取的,它允许您暂时或较少地更改适配器。该适配器用于 ActiveRecord。 - Unixmonkey
1
这在我的Rails 6项目中几乎起作用,但是应用程序在本地开发初始页面加载时出现错误,然后在随后的加载中运行良好。Puma捕获了此错误:无法加载数据库配置: 无法加载数据库配置。没有这样的文件 - ["config/database.yml"](RuntimeError) /Users/cdm32/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/railties-6.0.1/lib/rails/application/configuration.rb:240:in \database_configuration' /Users/cdm32/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.1/lib/active_record/railtie.rb:200:in block (2 level... - cdmo
1
@cdmo,谢谢你的关注。我已经更新了答案,使其完全兼容Rails 6。不确定你在回答中评论的所有内容,因为我创建了两个Rails应用程序,一个带有-O,另一个没有,并且action_mailerconfig/detabase.yml无关,所以没有必要进行评论。此外,在注释active_storage之后还有一些额外的行需要进行注释。 - Alter Lagos
显示剩余4条评论

55

environment.rb 文件中取消注释此行:

config.frameworks -= [ :active_record, :active_resource, :action_mailer]

2
在 Rails 3 中,只需从 Gemfile 中删除 mysql gem。 - jspooner
31
在Rails 4中,你会如何做同样的事情? - Daniel Ristic
2
Rails 4的问题:如何禁用ActiveRecord?https://dev59.com/J2Ik5IYBdhLWcg3wqPsi - grumpasaurus
此内容已过时。 - Tilo

17

在Rails 4中,当你开始一个新项目时,你可以使用-O或--skip-active-record

rails new my_project -O
rails new my_project --skip-active-record
如果您已经创建了一个项目,您需要进行评论。
 require "active_record/railtie"

来自 config/application.rb 和

 config.active_record.migration_error = :page_load

来自 config/environments/development.rb


14

如果你不需要数据库,那么你可能也不需要使用大部分的Rails。你可能需要一个更小、更可定制的框架来工作。

Sinatra 是一个小型框架,非常适合用于提供基本的静态页面。

但是如果你坚持要使用Rails 这里 有一篇文章将向你展示如何做到这一点或者可以参考这里


谢谢 - 这两个链接都涉及到Rails Recipes书中的步骤,可以让测试在没有数据库的Rails应用程序中工作。我有点懒,希望利用服务器上已经存在的Rails基础设施来为其他应用程序提供支持,但Sintatra看起来很有趣。 - RobbieCanuck
1
我不同意。Active.com是基于Rails构建的,没有数据库,因为所有数据都来自API。 - jspooner
注意:最后一句话中的第二个链接已经不存在了。我收到了404未找到错误。 - Pamela Cook - LightBe Corp

1

为了支持Rails 6 rc1和activerecord-nulldb-adaptergem,我们需要进行monkey patching。

config/initializers/null_db_adapter_monkey_patches.rb文件中进行。

module ActiveRecord
  module ConnectionAdapters
    class NullDBAdapter < ActiveRecord::ConnectionAdapters::AbstractAdapter
      def new_table_definition(table_name = nil, is_temporary = nil)
        TableDefinition.new(table_name, is_temporary)
      end
    end
  end
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接