2016-08-02 3 views
0

В моей Ruby On Rails проекта у меня есть беспокойство app/controllers/concerns/common.rb:Как использовать проблему в инициализаторе Rails?

module Common 
    extend ActiveSupport::Concern 

    private 

    def foo 
    end 

end 

я хочу использовать его foo функцию внутри config/initializers/devise.rb:

Devise.setup do |config| 
    ... 
    foo 
    ... 
end 

На данный момент мне не удалось хоть как-то загрузить common.rb внутри config/initializers/devise.rb - как сделать это?

В настоящее время я использую обходное решение - я определяю функцию foo внутри config/application.rb, и она работает, но она нарушает принципы СУХОЙ.

ответ

1

Теоретически вы могли бы включать ваше беспокойство внутри DEViSE конфигурации:

Devise.setup do |config| 
    include Common 
    foo 
    # ... 
end 

Таким образом, как никогда вы в том числе метод на главном объекте рубина/контекста верхнего уровня.

В качестве альтернативы вы можете расширить 'config' (= Devise) с помощью своего модуля и вызвать метод foo on config.

Devise.setup do |config| 
    config.send(:extend, Common) 
    config.foo 
    # ... 
end 

Чтобы сделать эту работу, однако вы должны сделать Foo публичный метод, в противном случае вы не сможете назвать это так.

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

+0

Спасибо, я использовал первый подход. Оно работает. – prograils

Смежные вопросы