Como configurar Ruby on Rails sem banco de dados?

102

Seria conveniente usar Ruby on Rails para um pequeno projeto de site que não precisa de um banco de dados. Eu sei que poderia criar um banco de dados vazio no MySQL e partir daí, mas alguém conhece uma maneira melhor de rodar Rails sem um banco de dados?

obrigado

RobbieCanuck
fonte

Respostas:

55

Remova o comentário desta linha no environment.rbarquivo:

config.frameworks -= [ :active_record, :active_resource, :action_mailer]
typemismatch
fonte
2
no rails 3, apenas remova a gem mysql do Gemfile
jspooner
31
Como você faria o mesmo no Rails 4?
Daniel Ristic
2
Pergunta para Rails 4 stackoverflow.com/questions/19078044/…
grumpasaurus
108

Para Rails 3 e Rails 4 :

Use -O('O' maiúsculo) ou --skip-activerecordopção para gerar um aplicativo sem banco de dados.

rails new myApp -O

ou

rails new myApp --skip-activerecord

Esta resposta é compartilhada de novo a partir daqui


Para Rails 5 :

Use a --skip-active-recordopção de gerar um aplicativo sem banco de dados

Observe o hífen extra '-' ao contrário das versões anteriores do Rails .

rails new myApp --skip-active-record

RSK
fonte
2
sim, isso funciona com Rails 4 :) - apenas validado. Se você quiser abandonar a unidade de teste, use: rails new myApp-O --skip-bundle -T
Chris Hough
1
Este é definitivamente o caminho mais fácil se você está começando do zero, embora esteja avisado que (pelo menos no Rails 4.0.1) existe um '-' entre active e record nesse comando. Portanto, deve ser: rails new myApp --skip-active-record
Nic Benders
1
Eu apenas enfrentei os problemas e percebi. Para Rails 4.2.x só -Ofunciona. A opção --skip-activerecordnão funciona.
Nazar Hussain
Isso também funciona em rails-api: rails new myApp -O. Obrigado
Abel de
2
Caso alguém esteja se perguntando, no Rails 5 é --skip-active-record(observe o traço entre o registro nad ativo). A outra maneira não funciona para mim.
audiodude de
53

Para um projeto Rails 4/5/6 existente, em seu config/application.rbarquivo você tem a seguinte linha:

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

(Como referência, essa linha está carregando este arquivo )
Portanto, em vez de carregar TODOS, você deve carregar cada biblioteca separadamente da seguinte forma:

# 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

Fique de olho nos comentários para saber o que carregar em relação à sua versão Rails.
Verifique também os seguintes arquivos (caso os tenha) e comente as seguintes linhas:

# 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

Remova também qualquer referência a ActiveRecord::Baseem seus arquivos de modelo (ou simplesmente exclua os arquivos, se aplicável). Por exemplo, o app/models/application_record.rbarquivo gerado automaticamente .

Alter Lagos
fonte
2
Para Rails 5, você também pode exigir active_job/railtieeaction_cable/engine
Ingmaras Keleras
2
Não existe um adaptador de banco de dados fictício para usar, de database.ymlforma que ele simplesmente ignore o banco de dados?
Chloe,
Rails 5 leva então ao problema de falha rake assets:precompiledevido a NoMethodError: undefined method active_record'`: /
flp
3
@Chloe O activerecord-nulldb-adapterde github.com/nulldb/nulldb permite que você troque o adaptador por uma mudança temporária ou menos invasiva.
Unixmonkey de
1
@cdmo ei, obrigado por notar. Eu atualizei a resposta para torná-la totalmente compatível com o rails 6. Não tenho certeza sobre tudo o que você comentou em sua resposta enquanto eu crio 2 aplicativos rails com e sem -Oe action_mailernão relacionados com config/detabase.yml, então não há necessidade de comentá-los. Além disso, há algumas linhas extras para comentar depois de active_storagecomentadas.
Alter Lagos
16

No Rails 4 ao iniciar um novo projeto você pode usar -O ou --skip-active-record

rails new my_project -O
rails new my_project --skip-active-record

Se você já criou um projeto, você precisará comentar

 require "active_record/railtie"

de config / application.rb e

 config.active_record.migration_error = :page_load

de config / environment / development.rb

John barela
fonte
14

Se você não precisa de um banco de dados, provavelmente não precisa ter muito Rails. Você pode querer uma estrutura menor e mais personalizável para trabalhar.

Sinatra é uma pequena estrutura ótima para servir páginas estáticas básicas.

Mas se você insiste em usar Rails aqui está um artigo que mostrará como fazer exatamente isso ou aqui .

vrish88
fonte
Obrigado - ambos os links referem-se ao livro Rails Recipes e contêm etapas para fazer o teste funcionar com um aplicativo Rails sem banco de dados. Eu estava sendo preguiçoso e esperava aproveitar a infraestrutura de trilhos já no servidor para outros aplicativos, mas Sintatra parece intrigante.
RobbieCanuck
1
Discordo. Active.com é construído em Rails sem banco de dados porque todos os dados vêm de uma API.
jspooner
Nota: O segundo link na última frase não existe mais. Recebo um erro 404 não encontrado.
Pamela Cook - LightBe Corp
0

Para suporte Rails 6 rc1 e activerecord-nulldb-adaptergem, precisamos de um monkey patching

Em 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
S.Chub
fonte