2015-10-20 2 views
2

Rails 4.2.4, Ruby 2.1.7Heroku ActionController :: RoutingError (неинициализированная постоянная ошибка)

У меня есть модуль внутри Lib/каталога.

Библиотека/BLL/user_feed.rb

module BLL 
class UserFeed 

    def initialize 
     logger.debug "Class has been initialized" 
    end 

    def get_user_feed(user_id) 
     # logic here 

     return { 
     # object 
     } 
    end 
end 
end 

Когда я пытаюсь включить, что в мой контроллер, чтобы использовать мою user_Feed логику,

class UserfeedController < ApplicationController 
    include BLL 

before_action :authenticate_user! 

    def show 
    # some logic 
    end 
end 

В моей конфигурации/application.rb

config.autoload_paths << Rails.root.join('lib') 

Это нормально работает на местном уровне, однако оно ломается, когда я развертываю его на Heroku.

он бросает

ActionController :: RoutingError (неинициализированная постоянная UserfeedController :: BLL):

ошибки.

2015-10-20T13:45:13.791457+00:00 app[web.1]: /app/app/controllers/api/v1/userfeed_controller.rb:1:in `<top (required)>': uninitialized constant Bll (NameError) 
2015-10-20T13:45:13.791457+00:00 app[web.1]: from /app/vendor/bundle/ruby/2.1.0/gems/railties-4.2.4/lib/rails/engine.rb:472:in `block (2 levels) in eager_load!' 
2015-10-20T13:45:13.791458+00:00 app[web.1]: from /app/vendor/bundle/ruby/2.1.0/gems/railties-4.2.4/lib/rails/engine.rb:471:in `each' 
2015-10-20T13:45:13.791459+00:00 app[web.1]: from /app/vendor/bundle/ruby/2.1.0/gems/railties-4.2.4/lib/rails/engine.rb:471:in `block in eager_load!' 
2015-10-20T13:45:13.791460+00:00 app[web.1]: from /app/vendor/bundle/ruby/2.1.0/gems/railties-4.2.4/lib/rails/engine.rb:469:in `each' 
2015-10-20T13:45:13.791462+00:00 app[web.1]: from /app/vendor/bundle/ruby/2.1.0/gems/railties-4.2.4/lib/rails/engine.rb:469:in `eager_load!' 
2015-10-20T13:45:13.791463+00:00 app[web.1]: from /app/vendor/bundle/ruby/2.1.0/gems/railties-4.2.4/lib/rails/engine.rb:346:in `eager_load!' 

Любые предложения?

enter image description here

+1

Попробуйте переименовать папку в нижний регистр ('BLL' ⇒' bll') и (вряд ли, первая должна помочь) 'include :: BLL'. – mudasobwa

+0

да, вот как у меня оно есть. lowercae bll – Harish

+0

см. мой последний ответ; может быть, это поможет вам – illusionist

ответ

0

Rails на самом деле загружает каталог приложений, когда приложение загружает. Поэтому на самом деле не нужно упоминать ваше приложение /bll в автозагрузках.

Однако, что я делаю неправильно здесь, в этом случае добавляется модуль поверх класса.

Итак, мое приложение ищет приложение/BLL/BLL/Безотносительно

module Bll - there is not need for this module to be declared 
    class Whatever 
    # some logic. 
    end 
end 

Все, что вам нужно сделать, это.

class Whatever 

end 

После этого ваш класс доступен для использования.

0

Я думаю, что Вы пропускаете module BLL; end в lib/bll.rb

Но также играть с именования модуля Bll, но я не думаю, что это

+0

, пожалуйста, посмотрите @ изменения выше, я добавил информацию об ошибке для получения дополнительной информации. – Harish

0

попробовать

config.autoload_paths += %W(#{config.root}/lib/BLL) 

и не забудьте перезагрузить сервер.

Редакция 1
Кроме того; изменение имени Dir BLL в bll также работает

+0

Ответ: отредактирован; убедитесь, что вы смотрели последний – illusionist

0

Рубиновые по умолчанию для CamelCase, вы должны будете использовать следующее:

#vendor/bll/user_feed.rb 
module Bll 
    class UserFeed 
    ... 
    end 
end 

Как второй, то vendor НАПРАВЛ автоматически загружаются (в меру моих знания), поэтому приведенный выше код должен работать, чтобы исправить ошибку UnrecognizedConstant.

https://softwareengineering.stackexchange.com/questions/123305/what-is-the-difference-between-the-lib-and-vendor-folders

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