Rails монтируемый движок: как приложения должны устанавливать переменные конфигурации?

У меня есть монтируемый движок под названием Blog, который могут использовать приложения.

Какой лучший способ разрешить приложениям, использующим движок, установить конфигурационную переменную типа site_name (чтобы двигатель мог отображать его в проекте)?

Update:

Я видел, как некоторые драгоценные камни создают файл config/initializers/gem_name.rb. Есть ли какие-либо спецификации о том, как:

  • Создайте файл на стороне сервера
  • Скопируйте его в сторону приложения
  • Как получить доступ к этим заданным переменным на стороне двигателя?

Я попытался создать Blog.site_name = "My Site" в файле app config/initializers/blog.rb, но получаю ошибку метода Undefined.

Ответ 1

Выявлено еще лучшее решение, которое также позволяет устанавливать значения по умолчанию (если приложение с использованием движка не указывает конфигурацию)...

1) Создайте конфигурационные переменные в приложении /config/initializers/blog.rb следующим образом:

Blog.setup do |config|
    config.site_name = "My Site Name"
end

2) В вашем двигателе /lib/blog/engine.rb установите значения по умолчанию, например:

module Blog

    class << self
        mattr_accessor :site_name
        self.site_name = "Site Name"

        # add default values of more config vars here
    end

     # this function maps the vars from your app into your engine
     def self.setup(&block)
        yield self
     end

end

3) Теперь вы можете просто получить доступ к конфигурационным переменным в вашем движке следующим образом:

Blog.site_name

Значительно чище.

Ответ 2

После многого тестирования и изучения существующих драгоценных камней, вот что работает в Rails 4:

С учетом вашего имени двигателя Blog:

В вашем двигателе /lib/blog/engine.rb введите следующее:

module Blog

    def self.setup(&block)
        @config ||= Blog::Engine::Configuration.new

        yield @config if block

        @config
    end

    def self.config
        Rails.application.config
    end

end

В своем приложении создайте файл с именем /config/initalizers/blog.rb и настройте конфигурационные файлы следующим образом:

Blog.setup do |config|
    config.testingvar = "asdfasdf"
end

Затем вы можете получить доступ к этим конфигурационным переменным ANYWHERE в вашем движке следующим образом:

Blog.config.testingvar

Надеюсь, это поможет кому-то. На данный момент документации очень мало, так что это все пробная версия и ошибка.