Rails - Rails.root.join плохо себя ведет после развертывания

В моем каталоге app/assets есть каталоги javascript и таблицы стилей, как и в любом обычном приложении Rails.

Однако я хотел также иметь каталог плагинов.

Пример:

app/assets/plugins/myPlugin1/somefile.js
app/assets/plugins/myPlugin1/somefile.css

Дело в том, если я использую

<%= javascript_include_tag 'plugins/myPlugin1/somefile.js' %>

Я бы получил ошибку 404, как

/assets/javascripts/plugins/myPlugin1/somefile.js

не существует. Тогда я заметил, что dir "plugins" пытался получить доступ внутри javascripts. Я предполагаю, что это как-то связано с "javascript_include_tag".

После некоторых исследований я понял, что мне нужно включить эту строку в config/application.rb

config.assets.paths << Rails.root.join("app", "assets")

И это, казалось, сработало. На WEBRick, на разработке, он работал прекрасно.


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

каталог

/public/assets/

был создан. Все в "app/assets/javascripts", "app/assets/stylesheets" и "app/assets/plugins" было предварительно скомпилировано в public/assets

ЧТО РАБОТАЕТ

app/assets/javascripts/login.js

был доступен в представлении, которое имело

<%= javascript_include_tag 'login.js' %>

ЧТО НЕ РАБОТАЕТ

Файлы, которые принадлежали "плагинам".

app/assets/plugins/myPlugin1/somefile.js

был предварительно скомпилирован в

public/assets/myPlugin1/somefile.js

Но когда я побежал

<%= javascript_include_tag 'plugins/myPlugin1/somefile.js' %>

он пытается получить доступ

/javascripts/plugins/myPlugin1/somefile.js

когда правильный путь, согласно моему опыту в разработке, будет:

/myPlugin1/somefile-(some hex hash).js

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

config.assets.paths << Rails.root.join("app", "assets")

к application.rb

В чем может быть проблема?

1 ответ

Решение

Вы могли бы пойти по этому пути:

Dir.glob("#{Rails.root}/app/assets/plugins/**/").each do |path|
  config.assets.paths << path
end

Или установите каждый плагин, один за другим, как:

config.assets.paths << Rails.root.join("app", "assets", "plugins", "myPlugin")

Но если у вас есть подкаталоги в этом каталоге, myPlugin не загрузит каждый файл. Так что первый вариант может быть лучше для вас.

Другие вопросы по тегам