Come configurare Ruby on Rails senza database?


102

Sarebbe conveniente usare Ruby on Rails per un piccolo progetto di sito web che non ha attualmente bisogno di un database. So che potrei creare un database vuoto in MySQL e partire da lì, ma qualcuno conosce un modo migliore per eseguire Rails senza un database?

Grazie

Risposte:



108

Per Rails 3 e Rails 4 :

Usa -O('O' maiuscola) o l' --skip-activerecordopzione per generare un'applicazione senza un database.

rails new myApp -O

o

rails new myApp --skip-activerecord

Questa risposta viene ricondivisa da qui


Per Rails 5 :

Usa l' --skip-active-recordopzione per generare un'applicazione senza un database

Notare il trattino aggiuntivo '-' rispetto alle versioni precedenti di Rails .

rails new myApp --skip-active-record


2
sì, funziona con Rails 4 :) - appena convalidato. Se vuoi abbandonare l'unità di prova usa: rails new myApp-O --skip-bundle -T
Chris Hough

1
Questo è sicuramente il modo più semplice se stai iniziando da zero, anche se tieni presente che (almeno in Rails 4.0.1) c'è un '-' tra attivo e record in quel comando. Quindi dovrebbe leggere: rails new myApp --skip-active-record
Nic Benders

1
Ho appena affrontato i problemi e l'ho notato. Per Rails 4.2.x -Ofunziona solo . L'opzione --skip-activerecordnon funziona.
Nazar Hussain

Funziona anche in rails-api: rails new myApp -O. Grazie
Abel

2
Nel caso qualcuno se lo stesse chiedendo, in Rails 5 è --skip-active-record(nota il trattino tra il record attivo e nad). L'altro modo non funziona per me.
audiodude

53

Per un progetto Rails 4/5/6 esistente, nel tuo config/application.rbfile hai la seguente riga:

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

(Come riferimento quella riga sta caricando questo file )
Quindi, invece di caricare TUTTO, è necessario caricare ciascuna libreria separatamente come segue:

# 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

Tieni d'occhio i commenti per sapere cosa caricare riguardo alla tua versione di Rails.
Controlla anche i seguenti file (se li hai) e commenta le seguenti righe:

# 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

Rimuovere anche qualsiasi riferimento a ActiveRecord::Basenei file del modello (o semplicemente eliminare i file se applicabili). Ad esempio, il app/models/application_record.rbfile generato automaticamente.


2
Per Rails 5 potresti anche richiedere active_job/railtieeaction_cable/engine
Ingmaras Keleras

2
Non c'è un adattatore DB fittizio da utilizzare in database.ymlmodo che ignorerà semplicemente il DB?
Chloe

Rails 5 porta quindi al problema di fallire a rake assets:precompilecausa di NoMethodError: undefined method active_record '': /
flp

3
@Chloe Il activerecord-nulldb-adapterda github.com/nulldb/nulldb ti consente di sostituire l'adattatore con una modifica temporanea o meno invasiva.
Unixmonkey

1
@cdmo hey, grazie per averlo notato. Ho aggiornato la risposta per renderla completamente compatibile con rails 6. Non sono sicuro di tutto ciò che hai commentato nella tua risposta poiché creo app 2 rails con e senza -Oe action_mailernon è correlato con config/detabase.yml, quindi non c'è bisogno di commentarlo. Inoltre ci sono alcune righe extra per commentare dopo che active_storageè stato commentato.
Alter Lagos

16

In Rails 4 quando inizi un nuovo progetto puoi usare -O o --skip-active-record

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

Se hai già creato un progetto dovrai commentare

 require "active_record/railtie"

da config / application.rb e

 config.active_record.migration_error = :page_load

da config / ambienti / development.rb


14

Se non hai bisogno di un database, probabilmente non hai bisogno di avere il grosso di Rails. Potresti volere un framework più piccolo e più personalizzabile con cui lavorare.

Sinatra è un piccolo framework ottimo per servire pagine statiche di base.

Ma se insisti nell'usare Rails, ecco un articolo che ti mostrerà come farlo o qui .


Grazie - entrambi questi link fanno riferimento al libro Rails Recipes e contengono i passaggi per far funzionare i test con un'applicazione rails senza database. Ero pigro e speravo di sfruttare l'infrastruttura dei binari già sul server per altre app, ma Sintatra sembra intrigante.
RobbieCanuck

1
Non sono d'accordo. Active.com è costruito su Rails senza database perché tutti i dati provengono da un'API.
jspooner

Nota: il secondo collegamento nell'ultima frase non esiste più. Ricevo un errore 404 non trovato.
Pamela Cook - LightBe Corp

0

Per supportare Rails 6 rc1 e activerecord-nulldb-adaptergem abbiamo bisogno di una patch di scimmia

In 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.