Монтируемый движок Rails: как приложения должны устанавливать переменные конфигурации?
У меня есть монтируемый двигатель Blog
что приложения могут использовать.
Как лучше всего разрешить приложениям, использующим движок, устанавливать переменную конфигурации, например site_name
(чтобы двигатель мог отображать это в дизайне)?
Обновить:
Я видел, как некоторые драгоценные камни создают файл 'config/initializers/gem_name.rb'. Есть ли какие-либо спецификации о том, как:
- Создайте такой файл на стороне движка
- Скопируйте его в приложение
- Как получить доступ к этим установленным переменным на стороне двигателя?
Я пытался создать 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
,