Як налаштувати Ruby on Rails без бази даних?


102

Було б зручно використовувати Ruby on Rails для невеликого веб-проекту, який не має поточної потреби в базі даних. Я знаю, що міг створити порожню базу даних в MySQL і піти звідти, але хтось знає кращий спосіб запустити Rails без бази даних?

Дякую

Відповіді:



108

Для рейок 3 і рейки 4 :

Використовуйте -O(величина "О") або --skip-activerecordопцію для створення програми без бази даних.

rails new myApp -O

або

rails new myApp --skip-activerecord

Ця відповідь переглядається звідси


Для рейок 5 :

Використовуйте --skip-active-recordопцію для генерації програми без бази даних

Зауважте додатковий дефіс '-' на відміну від попередніх версій Rails .

rails new myApp --skip-active-record


2
так, це працює з Rails 4 :) - просто підтверджено. Якщо ви хочете використати тестовий блок: рейки нового myApp-O --skip-bundle -T
Chris Hough

1
Це, безумовно, найпростіший шлях, якщо ви починаєте з нуля, хоча попередити, що (принаймні, в Rails 4.0.1) є активний "-" між активними і записами в цій команді. Тож слід читати: rails new myApp --skip-active-record
Нік Бендерс

1
Я просто зіткнувся з проблемами і помітив. Для Rails 4.2.x -Oпрацює лише Варіант --skip-activerecordне працює.
Назар Хуссейн

Це працює і в rails-api: rails new myApp -O. Спасибі
Abel

2
Якщо хтось цікавиться, у Rails 5 це --skip-active-record(зверніть увагу на тире між активними над записом). Інший спосіб не працює для мене.
audiodude

53

Для існуючого проекту Rails 4/5/6 у вашому config/application.rbфайлі є наступний рядок:

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

(В якості посилання, що цей рядок завантажує цей файл )
Отже, замість завантаження ВСІХ, ви повинні завантажити кожну бібліотеку окремо так:

# 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

Слідкуйте за коментарями, щоб знати, що завантажувати щодо вашої версії 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/railtieіaction_cable/engine
Ingmaras Keleras

2
Чи не використовується макетний адаптер БД, database.ymlщоб він просто ігнорував БД?
Хлоя

Рейки 5 призводять до проблеми збою rake assets:precompileчерез NoMethodError: undefined method active_record'`: /
flp

3
@Chloe The activerecord-nulldb-adapterfrom github.com/nulldb/nulldb дозволяє замінити адаптер для тимчасової або менш інвазивної зміни.
Unixmonkey

1
@cdmo ей, дякую, що помітили. Я оновив відповідь, щоб зробити її повністю сумісною з рейками 6. Не впевнений у всьому, що ви прокоментували у своїй відповіді, оскільки я створюю 2 додатки для рейків з і без -Oі action_mailerне пов’язані з ними config/detabase.yml, тому не потрібно коментувати це. Також є кілька додаткових рядків для коментарів після active_storageкоментування.
Альтер Лагос

16

У 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 / середовища / development.rb


14

Якщо вам не потрібна база даних, вам, ймовірно, не потрібно мати основну частину Rails. Можливо, ви хочете працювати з меншою рамкою, яка більше налаштовується.

Сінатра - це крихітна рамка, яка чудово підходить для розміщення основних статичних сторінок.

Але якщо ви наполягаєте на використанні Rails, ось стаття, яка покаже вам, як робити саме це чи тут .


Дякуємо - обидва ці посилання стосуються книги Rails Recipes і містять кроки для тестування роботи з додатком рельсів без бази даних. Я лінувався і сподівався використовувати інфраструктуру рейок уже на сервері для інших додатків, але Синтатра виглядає інтригуючо.
RobbieCanuck

1
Я не погоджуюсь. Active.com побудований на Rails без бази даних, оскільки всі дані надходять з api.
jspooner

Примітка: Другої ланки в останньому реченні більше не існує. Я отримую помилку 404 не знайдено.
Памела Кук - LightBe Corp

0

Для підтримки Rails 6 rc1 і activerecord-nulldb-adaptergem нам потрібна виправлення мавп

У config / inicijalizer / 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.