Стратегии для переопределения database.yml - PullRequest
1 голос
/ 01 февраля 2011

Есть еще один вопрос по стеку с этим заголовком. Это ссылка на это. Мой вопрос немного другой, но почти на одной линии

Я работаю с базой данных, в которой есть несколько пользователей, каждый из которых имеет уникальный набор привилегий для базы данных. Поэтому я не могу жестко закодировать данные для входа в базу данных в database.yml. Вместо этого я хочу создать HTML-форму, которая собирает учетные данные для входа. Я понимаю, что database.yml может быть написан erb способом из этой ссылки . Но к тому времени, когда мой index.html (страница, на которой я написал свою форму) показывается, попытка установить соединение завершена, и выдает ошибку, сообщающую, что для имени пользователя и пароля предоставлено значение nil. Пожалуйста, дайте мне знать, как решить эту проблему.

Я новичок в рельсах, поэтому, пожалуйста, спросите меня, не предоставил ли я достаточно информации. Заранее спасибо

1 Ответ

3 голосов
/ 01 февраля 2011

Используйте ActiveRecord :: ConnectionHandling.establish_connection вызов функции для подключения к вашей базе данных.Вы должны иметь возможность устанавливать соединение с другим пользователем даже на каждой странице, если хотите, или искать учетные данные базы данных в модели пользователя.

Если вы делаете это, вы можете рассмотреть возможность создания подкласса ActiveRecord::Base и переопределение вызова connection, который затем будет использоваться каждой моделью для подключения к базе данных.

Если вы хотите полностью избежать подключения к базе данных, прежде чем явно настроить учетные данные через свое приложениетогда вы, вероятно, захотите инициализировать Rails без загрузки всех специфических вещей ActiveRecord.В этом случае вам нужно будет удалить ActiveRecord из инициализации Rails, поместив эту строку в ваш config/environment.rb в блоке Rails::Initializer.run do |config|:

config.frameworks -= [ :active_record ]

Затем вам нужно будет загрузить всеОпределенные вещи ActiveRecord, когда у вас есть учетные данные.

В качестве альтернативы, вы можете переопределить Rails::Initialize::initialize_database, где используется фактическое соединение с базой данных, поместив его в ваш environment.rb перед вызовом Rails::Initializer.run:

module Rails
  class Initializer
    def initialize_database
      nil
    end
  end
end

До версии 4.x вы бы использовали ActiveRecord :: Base.establish_connection , который сейчас не рекомендуется.

...