Извлечь некоторые конфигурационные переменные из БД для динамической установки в среде Rails?

Можно ли установить некоторые переменные конфигурации в production.rb динамически, используя значения из базы данных?

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

Например:

// production.rb
config.action_mailer.default_url_options  = { :host => current_tenant.domain }

current_tenant - это вспомогательный метод, определенный в ApplicationHelper, поэтому к нему нельзя получить доступ в production.rb

Вот current_tenant:

// application_helper.rb
def current_tenant
  @current_tenant ||= Tenant.find_by(domain: Apartment::Tenant.current)
end

Если нет, возможно ли динамическое создание secrets.yml с использованием данных БД? С тех пор я смогу использовать ENV в production.rb


person Jacob    schedule 18.06.2015    source источник
comment
Как вы получаете доступ к своему текущему арендатору? Не могли бы вы сделать промежуточное ПО?   -  person Mkou    schedule 18.06.2015
comment
@Mkou Добавлено в вопрос. Как я могу сделать это в промежуточном программном обеспечении?   -  person Jacob    schedule 18.06.2015
comment
Можете ли вы попробовать установить URL-адрес в почтовом ящике, он сам предполагает, что класс почтового отправителя - UserMailer UserMailer.default_url_options[:host] = 'domain'   -  person Anant Kolvankar    schedule 18.06.2015
comment
Почтовая программа - это всего лишь один пример, есть и другие переменные конфигурации, которым также нужны динамические данные из базы данных.   -  person Jacob    schedule 18.06.2015
comment
Не могли бы вы привести нам другие примеры?   -  person Mkou    schedule 18.06.2015
comment
Еще одна вещь: вы можете просто добавить before_filter set_tenant_config в ApplicationController и выполнить всю свою конфигурацию в этом методе   -  person Anant Kolvankar    schedule 18.06.2015


Ответы (2)


Возможно, вы можете попробовать это вместо этого: Создайте вспомогательный метод для своих писем:

def build_tenant_url(route_name, *args)
  opts = args.extract_options!
  opts.merge!(host: @tenant ? @tenant.domain : your_domain)
  #Here you can merge other options if you need to pass a token etc
  Rails.application.routes_url_helpers.send(:"#{route_name}_url", *args, opts)
end

В вашей почтовой программе определите @tenant

Затем в своем электронном письме используйте его

= link_to 'Edit', build_tenant_url(:edit_tenant, @tenant) 
person Mkou    schedule 18.06.2015
comment
Почтовая программа - это всего лишь один пример, есть и другие переменные конфигурации, которым также нужны динамические данные из базы данных. - person Jacob; 18.06.2015
comment
Не могли бы вы привести нам другие примеры? - person Mkou; 18.06.2015
comment
Другой пример - инициализаторы. Инициализатору гема Devise потребуются api_keys для Facebook и Google (которые специфичны для каждого клиента). - person Jacob; 18.06.2015
comment
Еще один пример для production.rb - это гем Paperclip и его глобальная конфигурация с ключами API Amazon S3 (которые снова являются специфическими для каждого клиента). - person Jacob; 18.06.2015
comment
Поскольку конфигурация запускается один раз при создании приложения, вы не можете настроить приложение более чем одним способом. Вам придется решать по одной проблеме за раз - person Mkou; 18.06.2015

Эта настройка запускается при запуске приложения, поэтому, если вы хотите, чтобы параметр управлялся какой-либо переменной, эта переменная должна быть доступна для кода Ruby, который запускается при запуске. Это можно сделать разными способами

  • сценарий (или что-то еще), запускающий ваш сервер rails, проходит через параметр
  • значение записывается в текстовый файл каким-либо другим процессом и снова считывается сценарием запуска
  • снова то же самое, но с переменной окружения

Например, если вы предоставляете каждому клиенту (группе пользователей) свой собственный поддомен в своем приложении, то имя поддомена можно использовать в качестве ключа для кода запуска для чтения базы данных и получения некоторых сведений об этом клиенте. Затем этот поддомен будет передан в приложение, когда вы его раскрутите.

ИЗМЕНИТЬ - сказав все это, я не уверен, нужно ли вам вообще изменять конфигурацию запуска. Разве вы не можете просто искать соответствующее доменное имя всякий раз, когда вы отправляете электронное письмо, вместо того, чтобы изменять значение по умолчанию, установленное в конфигурации?

person Max Williams    schedule 18.06.2015