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