Comment configurer Ruby on Rails sans base de données?

102

Il serait pratique d'utiliser Ruby on Rails pour un petit projet de site Web qui n'a pas besoin actuellement d'une base de données. Je sais que je pourrais créer une base de données vide dans MySQL et partir de là, mais est-ce que quelqu'un connaît une meilleure façon d'exécuter Rails sans base de données?

Merci

RobbieCanuck
la source

Réponses:

55

Décommentez cette ligne dans le environment.rbfichier:

config.frameworks -= [ :active_record, :active_resource, :action_mailer]
incompatibilité de type
la source
2
dans rails 3, supprimez simplement le gem mysql du Gemfile
jspooner
31
Comment feriez-vous la même chose dans Rails 4?
Daniel Ristic
2
Question pour Rails 4 stackoverflow.com/questions/19078044/…
grumpasaurus
109

Pour les rails 3 et 4 :

Utilisez -O(Capital 'O') ou une --skip-activerecordoption pour générer une application sans base de données.

rails new myApp -O

ou

rails new myApp --skip-activerecord

Cette réponse est transférée à partir d' ici


Pour les rails 5 :

Utilisez l' --skip-active-recordoption pour générer une application sans base de données

Notez le tiret supplémentaire «-» par opposition aux versions précédentes de Rails .

rails new myApp --skip-active-record

RSK
la source
2
oui, cela fonctionne avec Rails 4 :) - juste validé. Si vous voulez abandonner l'unité de test, utilisez: rails new myApp-O --skip-bundle -T
Chris Hough
1
C'est certainement le moyen le plus simple si vous partez de zéro, mais sachez que (au moins dans Rails 4.0.1) il y a un «-» entre actif et enregistrement dans cette commande. Donc, il devrait lire: rails new myApp --skip-active-record
Nic Benders
1
J'ai juste fait face aux problèmes et j'ai remarqué. Pour Rails 4.2.x -Ofonctionne uniquement . L'option --skip-activerecordne fonctionne pas.
Nazar Hussain du
Cela fonctionne aussi dans rails-api: rails new myApp -O. Merci
Abel
2
Au cas où quelqu'un se demanderait, dans Rails 5, c'est --skip-active-record(notez le tiret entre l'enregistrement actif et l'enregistrement). L'autre moyen ne fonctionne pas pour moi.
audiodude
53

Pour un projet Rails 4/5/6 existant, dans votre config/application.rbfichier, vous avez la ligne suivante:

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

(Comme référence, cette ligne charge ce fichier )
Donc, au lieu de charger ALL, vous devez charger chaque bibliothèque séparément comme suit:

# 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

Gardez un œil sur les commentaires pour savoir ce qu'il faut charger concernant votre version de Rails.
Vérifiez également les fichiers suivants (au cas où vous en auriez) et commentez les lignes suivantes:

# 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

Supprimez également toute référence à ActiveRecord::Basedans vos fichiers de modèle (ou supprimez simplement les fichiers le cas échéant). Par exemple, le app/models/application_record.rbfichier généré automatiquement .

Alter Lagos
la source
2
Pour Rails 5, vous voudrez peut-être également exiger active_job/railtieetaction_cable/engine
Ingmaras Keleras
2
N'y a-t-il pas un adaptateur DB factice à utiliser database.ymlpour ignorer simplement la base de données?
Chloe
Rails 5 conduit alors au problème d'échec rake assets:precompiledû à NoMethodError: undefined method active_record'`: /
flp
3
@Chloe Le activerecord-nulldb-adapterde github.com/nulldb/nulldb vous permet d'échanger l'adaptateur pour un changement temporaire ou moins invasif.
Unixmonkey
1
@cdmo hé, merci d'avoir remarqué. J'ai mis à jour la réponse pour la rendre entièrement compatible avec les rails 6. Je ne suis pas sûr de tout ce que vous avez commenté dans votre réponse, car je crée des applications de 2 rails avec et sans -Oet action_mailersans lien avec config/detabase.yml, il n'est donc pas nécessaire de le commenter. Il y a aussi quelques lignes supplémentaires à commenter après avoir active_storageété commenté.
Alter Lagos
16

Dans Rails 4, lors du démarrage d'un nouveau projet, vous pouvez utiliser -O ou --skip-active-record

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

Si vous avez déjà créé un projet, vous devrez commenter

 require "active_record/railtie"

depuis config / application.rb et

 config.active_record.migration_error = :page_load

depuis config / environnements / development.rb

John Barela
la source
14

Si vous n'avez pas besoin d'une base de données, vous n'avez probablement pas besoin de la plupart des Rails. Vous voudrez peut-être un cadre plus petit et plus personnalisable avec lequel travailler.

Sinatra est un petit framework idéal pour servir des pages statiques de base.

Mais si vous insistez pour utiliser Rails, voici un article qui vous montrera comment faire exactement cela ou ici .

vrish88
la source
Merci - ces deux liens font référence au livre de recettes Rails et contiennent des étapes pour faire fonctionner les tests avec une application de rails sans base de données. J'étais paresseux et j'espérais exploiter l'infrastructure des rails déjà sur le serveur pour d'autres applications, mais Sintatra semble intrigante.
RobbieCanuck
1
Je ne suis pas d'accord. Active.com est construit sur Rails sans base de données car toutes les données proviennent d'une api.
jspooner
Remarque: le deuxième lien de la dernière phrase n'existe plus. J'obtiens une erreur 404 non trouvée.
Pamela Cook - LightBe Corp
0

Pour le support Rails 6 rc1 et activerecord-nulldb-adaptergem, nous avons besoin d'un patching de singe

Dans 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
la source