Передача переменных в config / environment / demo.rb из приложения Rails - PullRequest
0 голосов
/ 01 октября 2011

Последние несколько дней я боролся с проблемой в приложении Ruby on Rails, над которым я сейчас работаю.У меня разные страны, и для каждой страны мы используем разные корзины Amazon S3.Учетные данные ключей Amazon S3 хранятся в виде констант в config / средах / environment_name.rb (например, demo.rb). Я не могу определить, с какой страной мы работаем, из файла конфигурации.Я могу определить, в какой стране мы работаем, по контроллерам, моделям, представлениям и т. Д., Но не по файлу конфигурации.Есть ли в Ruby метапрограммирование или какая-то другая магия, о которой я не знаю, поэтому я хочу сказать, если мы работаем над Великобританией как страной в приложении, используем учетные данные Великобритании или Германию как страну, используем Германиюучетные данные ведра?Я не могу придумать, как передать параметры в файлы среды из самого приложения.Заранее большое спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 04 октября 2011

Напишите немного промежуточного программного обеспечения, если вы хотите, чтобы знание конфигурации для каждой страны не попало в основное приложение.

Промежуточное программное обеспечение чрезвычайно просто.Промежуточное программное обеспечение бездействия выглядит следующим образом:

class DoesNothing
  def initialize(app, *args)
    @app = app
  end

  def call(env)
    @app.call(env)
  end
end

Rack приводит в действие приложения посредством объединения нескольких промежуточных программ вместе ... каждому дается ссылка на @app, который является следующим звеном в цепочке,и он должен вызвать #call в этом приложении.Приложение в конце цепочки запускает приложение.

Итак, в вашем случае вы можете выполнить некоторые дополнительные настройки здесь.

class PerCountryConfiguration
  def initialize(app)
    @app = app
  end

  def call(env)
    case env["COUNTRY"]
      when "AU"
        Rails.application.config.s3_buckets = { ... }
      when "US"
        Rails.application.config.s3_buckets = { ... }
      ... etc        
    end

    @app.call(env)
  end
end

Существует несколько способов использования промежуточного программного обеспечения,но поскольку это зависит от доступа к среде Rails, вы захотите сделать это изнутри Rails.Поместите его в ваш application.rb:

config.middleware.use PerCountryConfiguration

Если вы хотите передать дополнительные аргументы конструктору вашего промежуточного программного обеспечения, просто перечислите их после имени класса:

config.middleware.use PerCountryConfiguration, :some_argument

Вы можететакже смонтируйте промежуточное программное обеспечение изнутри ApplicationController, что означает, что все инициализаторы и все уже будут выполнены, так что это может быть слишком далеко по цепочке.

0 голосов
/ 01 октября 2011

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

# config/s3.rb
S3_BUCKETS => { 
  :us => 'our-files-us',
  :gb => 'our-files-gb',
  :tz => 'special-case'
}

Затем вы можете выбрать учетные данные по запросу (например, в вашем AppController):

bucket_name = S3_BUCKETS[I18n.locale]
# pass this info to your S3 client

Имеет смысл?

...