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

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

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

Обновить:

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

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

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

3 ответа

Решение

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

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

Гораздо чище.

После многих испытаний и изучения существующих гемов, вот что работает в 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

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

Blog.config.testingvar

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

Я знаю, что это довольно старый пост, но если кто-то в будущем обнаружит это, я бы порекомендовал гем Angostura для передачи зависимостей в движок Rails. Чтобы использовать его, предполагая, что мой движок называется "Блог", и я хочу получить доступ к переменной с именем "site_name", двигатель lib/blog.rb выглядит примерно так:

require "blog/engine"
require "angostura"

module Blog
  include Angostura::Dependencies

  dependency :site_name
end

В моем основном приложении, в config/initializers/blog.rb, Я добавил

Blog.setup do |config|
  config.site_name = "My site name"
end

Теперь я могу получить доступ site_name в моем двигателе, позвонив Blog.site_name,

Я хотел бы отметить, что значения по умолчанию также поддерживаются, так что вы можете сделать что-то вроде dependency site_name: 'Default site name' в lib/blog.rb, Кроме того, вы можете передавать целые классы как зависимости, отправляя им строковые имена классов, например config.my_class = 'MyClass',

Для потомков, чтобы использовать драгоценный камень, я добавил s.add_dependency "angostura", "0.6.0" в gemspec моего двигателя, а затем побежал bundle install,

Другие вопросы по тегам