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 не загрузит каждый файл. Так что первый вариант может быть лучше для вас.