2016-09-22 1 views
0

Я пытаюсь скомпилировать свои активы для производства, это делается не локально.rake assets: прекомпиляция без подключения к базе данных и с динамическими маршрутами

У меня есть 2 ограничения:

  • Я не могу подключиться к базе данных (для этого шага)
  • У меня динамический маршрут, как правило, требуют, чтобы получить информацию из БД (но это не обязательно для составления активов)

В основном я запускаю изображение докеров, которое строится вне производственной среды. Я не могу подключить db. Я использовал трюк, передав ложный адрес db с env_var непосредственно в файле docker.

Но теперь у меня есть динамический маршрут:

scope path: ":tenant", constraints: {tenant: Apartment.tenant_names.join('|')} do 
    .... 
end 

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

Но когда мне нужно скомпилировать активы, они не сработали, потому что в результате компиляции приложение и маршруты попытались сделать Apartment.tenant_names.join('|'), что, очевидно, провалилось без соединения db.

Если я заменил Apartment.tenant_names.join('|') на строку, db не вызывается и компиляция работает нормально.

Есть ли что-то я могу использовать, чтобы увидеть, если компиляции шаг пытается инициализировать приложение и сделать условие, чтобы сделать что-то вроде:

if assets_are_compiling? 
    scope path: ":tenant", constraints: {tenant: "assets_compiling"} do 
    .... 
else 
    scope path: ":tenant", constraints: {tenant: Apartment.tenant_names.join('|')} do 
    .... 
end 

Любая идея?

EDIT: обходной путь

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

scope path: ":tenant", constraints: lambda {|request| (Apartment.tenant_names.include?(request.path.split('/')[1])) } do 
+0

Какова цель определения маршрутов таким образом динамически? Мне кажется, что вы делаете что-то вроде тщеславия очень неправильно. – max

+0

Я знаю, что динамический элемент в route.rb не является «рельсовым способом». Это вопрос о том, возможно это или нет. Почему я спрашиваю об этом из-за использования многопользовательского приложения без субдоменов. Я не хочу, чтобы запросы, которые не являются арендаторами, связаны с падением публичной шемы. Вот почему мое ограничение полезно, поэтому я могу захватить не связанный с ним запрос арендатора и правильно маршрутизировать его. Я открою вопрос о Apartment Github. –

+0

@max Я установил обходное решение, которое разрешает ошибку, оно более чистое для маршрутов. –

ответ

1

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

if caller.to_s.match(/\/bin\/rake:\d+/) and caller.to_s.match(/\/lib\/sprockets\/rails\/task\.rb:\d+/) 
    scope path: ":tenant", constraints: {tenant: "assets_compiling"} do 
    ... 
    end 
else 
    scope path: ":tenant", constraints: {tenant: Apartment.tenant_names.join('|')} do 
    ... 
    end 
end 

Этот код в основном делает трассировки стека, чтобы увидеть, если он был вызван из rake assets:precompile. Но, как я уже сказал, вам может понадобиться настроить регулярное выражение.

+0

Спасибо за ответ, я проверю его как можно скорее! –

+0

caller.to_s возвращает слишком много элементов, фильтруя их, чтобы получить прекомпиляцию: активы без ложных срабатываний будут сложными. Я буду иметь это в виду на данный момент. –

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

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