【问题标题】:How to configure Ruby on Rails with no database?如何在没有数据库的情况下配置 Ruby on Rails?
【发布时间】:2010-10-23 16:53:08
【问题描述】:

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

谢谢

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

    如果您不需要数据库,那么您可能不需要大量的 Rails。您可能需要一个更小、更可定制的框架来使用。

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

    但是,如果你坚持使用 Rails,here 是一篇将向你展示如何做到这一点的文章或here

    【讨论】:

    • 谢谢 - 这两个链接都引用了 Rails 食谱书,并包含使用无数据库 Rails 应用程序进行测试的步骤。我很懒惰,希望将服务器上已有的 Rails 基础设施用于其他应用程序,但 Sintatra 看起来很有趣。
    • 我不同意。 Active.com 建立在 Rails 之上,没有数据库,因为所有数据都来自 api。
    • 注:最后一句中的第二个链接已不存在。我收到 404 未找到错误。
    【解决方案3】:

    对于 Rails 3Rails 4

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

    rails new myApp -O

    rails new myApp --skip-activerecord

    此答案由here转发


    对于 Rails 5

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

    请注意额外的连字符“-”,而不是以前的 Rails 版本

    rails new myApp --skip-active-record

    【讨论】:

    • 是的,这适用于 Rails 4 :) - 刚刚验证。如果你想放弃测试单元使用: rails new myApp-O --skip-bundle -T
    • 如果您从头开始,这绝对是最简单的方法,但请注意(至少在 Rails 4.0.1 中)该命令中的活动和记录之间有一个“-”。所以它应该是: rails new myApp --skip-active-record
    • 我刚遇到这些问题并注意到了。对于 Rails 4.2.x 仅 -O 有效。 --skip-activerecord 选项不起作用。
    • 这也适用于 rails-api: rails new myApp -O 。谢谢
    • 如果有人想知道,在 Rails 5 中它是--skip-active-record(注意活动 nad 记录之间的破折号)。另一种方法对我不起作用。
    【解决方案4】:

    在 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

    【讨论】:

      【解决方案5】:

      对于现有的 Rails 4/5/6 项目,在您的 config/application.rb 文件中,您有以下行:

      require 'rails/all' # or `require "rails"' in newer versions
      

      (作为参考,该行正在加载this file
      因此,您必须按如下方式分别加载每个库,而不是加载 ALL:

      # active_record is what we're not going to use it, so comment it "just in case"
      # 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"
      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
      

      密切关注 cmets 以了解有关您的 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 文件。

      【讨论】:

      • 对于 Rails 5,您可能还需要 active_job/railtieaction_cable/engine
      • database.yml 中没有要使用的虚拟数据库适配器,所以它会忽略数据库吗?
      • Rails 5 由于NoMethodError: undefined method active_record'` 导致rake assets:precompile 失败的问题:/
      • @Chloe 来自github.com/nulldb/nulldbactiverecord-nulldb-adapter 允许您更换适配器以进行临时或侵入性较小的更改。
      • @cdmo 嘿,感谢您的关注。我已经更新了答案以使其与 rails 6 完全兼容。不确定您在答案中评论的所有内容,因为我创建了 2 个带有和不带 -Oaction_mailer 的 rails 应用程序与 config/detabase.yml 无关,所以没有必要评论它。在active_storage 被评论后还有一些额外的行要评论。
      【解决方案6】:

      为了支持 Rails 6 rc1 和 activerecord-nulldb-adaptergem,我们需要一个猴子补丁

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-24
        • 2015-11-30
        • 2016-08-18
        • 1970-01-01
        • 2012-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多