2014-10-30 2 views
1

Я создаю скрипт, чтобы попробовать некоторые функции. Но я не могу использовать модели в lib. Интересно, что у меня уже есть lib, и там он отлично работает с главным образом тем же кодом (?).Невозможно получить доступ к моделям из/lib в Rails

// script/tags.rb: 
require File.expand_path('../../config/application', __FILE__) 
require 'company_tags' 

host = ARGV[0] || 'team1.crm.tld' 

c = CompanyTags.new(host) 
c.run 

// lib/company_tags.rb 
class CompanyTags 
    def initialize(host) 
    @site = Site.where(host: host).first 
    end 

    def run 
    comp = @site.companies.first 
    comp.tag_list.add("tag1") 
    comp.general_list.add("tag_general") 
    comp.save! 
    p comp.tag_list 
    end 
end 

Ошибка: /lib/company_tags.rb:3:in `инициализации ': неинициализированные постоянные CompanyTags :: Сайт (NameError)

ответ

3

Вам потребуется среда, а не приложение.

require File.expand_path('../../config/environment', __FILE__) 
require 'company_tags' 

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

+0

Вау, спасибо, это работает очень хорошо, но, вы можете объяснить мне, почему один и тот же код работает для других пар скрипта + lib? Там я использовал приложение. – TheVic

+1

Возможно, это сработало использование было загружено по-другому, например через консоль. Или потому, что вы не используете модели, определенные в среде. –

1

только идея, но попробуйте изменить Site.where(host: host).first к ::Site.where(host: host).first. Помещая :: спереди, заставляет ruby ​​искать Site в глобальном пространстве имен вместо константы, определенной в CompanyTags.

+0

Nope. Та же ошибка. (( – TheVic

+0

) О, извините, ошибка несколько отличается: в 'initialize ': неинициализированная константа Site (NameError) – TheVic

+1

ОК, классно - это, по крайней мере, исключает возможность постоянного поиска. – jerhinesmith

1

Вы можете добавить простую конфигурацию config/application.rb:

# Autoload lib/ folder including all subdirectories 
config.autoload_paths += Dir["#{config.root}/lib/**/"] 

Проверить это question для большего количества деталей.

+0

Я думаю, что вы не правы, couse Я запускаю его с консоли. – TheVic

+1

фактически команды «rails console» или 'rails c' загружают все ваши файлы приложений, включая драгоценные камни. – mohameddiaa27

+0

Я имею в виду терминал. сценарий, например: ruby ​​script/tags.rb. Но, в любом случае, я попробую. – TheVic

1

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

Через require_all функции

require_all(MY_CLASSES_DIRECTORY)

Или, требуя от каждого класса вручную:

require 'Class_NAME.rb'

Обратите внимание, что Site класс не требуется в любом месте.

Для получения более подробной информации, проверить этот link

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