2016-03-28 4 views
1

У нас есть проблема, которую мы хотим использовать в качестве микса для наших классов пользователей. Эта проблема встречается в нашем отдельном двигателе рельсов, который мы используем для нескольких продуктов.Использование Концерна, вложенного в модуль

Все в этом двигателе, мы храним в том же модуле, который мы будем называть MyEngine.

module MyEngine 
    module EngineUser 
    extend ActiveSupport::Concern 
    end 
end 

И мы Тринг, чтобы включить его, как и любой другой интерес в нашем Rails Применение:

class User < ActiveRecord::Base 
    include MyEngine::EngineUser 
    # ... 
end 

Это вызывает ошибку, когда он говорит: (форматированный некоторые для удобства чтения)

/Users/foo/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.4/lib/active_support/dependencies.rb:495:in `load_missing_constant ':

Невозможно автозагрузку постоянной EngineUser, ожидается /Users/foo/Perforce/engine_folder/app/models/concerns/engine_user.rb определить его

Какой ..... это правильный файл .. . <. <

Если я удалю module MyEngine вокруг класса и сформирую его в User, он будет работать нормально.

Я знаю, что рельсы делают автозагрузку за кулисами, но почему это не работает? Он знает, что файл имеет класс ... если я переведу его в engine/app /, то он говорит, что он не может найти его там. Настолько разочаровывающе.

ответ

1

Это должно решить вашу проблему. Недавно у меня была та же проблема.

Посмотрите на дополнительный модуль, Concerns, я добавил.

module MyEngine 
    module Concerns 
    module EngineUser 
     extend ActiveSupport::Concern 
    end 
    end 
end 

# lib/my_engine/engine.rb 
module MyEngine 
    class Engine < ::Rails::Engine 
    config.autoload_paths += %W(#{MyEngine::Engine.root}/app/models/my_engine/concerns/engine_user.rb) 
    isolate_namespace MyEngine 
    end 
end 

# app/models/user.rb 
class User < ActiveRecord::Base 
    include MyEngine::Concerns::EngineUser 
    # ... 
end 

Вот RailsGuide пост, который привел меня к ответу.

+0

Так что я думаю, что это работает, но я закончил тем, что перешел к другому решению, которое я отправлю в ближайшее время. Спасибо, хотя! – Avaista

0

Так что ответ от Джастин Ликаты, вероятно, «правильный» ответ, но решение, что я в конечном итоге происходит с следующим образом:

в engine_folder/lib/my_engine.rb, который, что входит в состав нагружать двигатель, Я просто использовал строку:

Dir[File.dirname(__FILE__) + "/my_engine/concerns/**/*.rb"].each { |file| require file[0..-4]} 

это, безусловно, имеет некоторый запах к нему, я признаю, но это позволяет нам следовать нашим собственным соглашениям и структуре, а также позволяет добавлять иерархии папок по мере необходимости, не заботясь о рельсах самозарядных вопросов ,

Спасибо за ответы!

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

  • Нет связанных вопросов^_^