запретить Rails пытаться использовать конвейер ресурсов для изображений в папке / public / images - PullRequest
0 голосов
/ 20 января 2020

Я использую поведение Rails по умолчанию для прекомпиляции ресурсов в производственной среде.

Теперь у меня есть несколько сотен изображений продуктов, которые хранятся в public / images / 560 и обновляются еженедельно. Поэтому я не хочу, чтобы эти изображения были в конвейере ресурсов (в противном случае мне придется предварительно компилировать ресурс при каждом обновлении изображений и перезапускать сервер, верно?).

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

<div class="image-holder">
    <% if File.file? "#{Rails.root.join('public', 'images', '560')}/#{@product.metauid}_v#{@product.version}.png" %>
      <img class="product-image py-5" src='<%= "#{request.base_url}" %>/images/560/<%= "#{@product.metauid}_v#{@product.version}_geopard_560.png" %>' alt="<%= @product.metauid%>_v<%= @product.version %>_560.png">
    <% else %>
      <%= image_tag("placeholder.png", class: "placeholder") %>
    <% end %>
  </div>

Но изображение не показывается. В Chrome Инспектор я вижу HTTP-код 303.

Как я могу предотвратить попытки Rails использовать конвейер ресурсов для изображений в папке / public / images?

1 Ответ

1 голос
/ 20 января 2020

Поэтому я не хочу, чтобы эти изображения в конвейере ресурсов (в противном случае мне придется предварительно компилировать ресурс при каждом обновлении изображений и перезапускать сервер, верно?).

Да. Как и сгенерированные пользователем изображения, они не должны быть в конвейере, а просто храниться в /public или, что еще лучше, в облачной CDN, такой как S3. Конвейер ресурсов предназначен для ресурсов, которые можно скомпилировать во время развертывания.

Возможно, вы захотите использовать ActiveStorage или CarrierWave, которые могут обрабатывать изменение размера изображения, а также заполнители вместо повторного изобретения колеса.

Заметьте, вы можете по-прежнему использовать Rails-файлы из /public, которые не являются частью конвейера ресурсов. Если вы хотите пример, попробуйте localhost:3000/robots.txt. Это действительно полезно при разработке, поскольку у вас, вероятно, нет локальной настройки NGINX или Apache для обслуживания файлов.

Как отключить рельсы для обслуживания файлов stati c, зависит от вашей версии Rails. Обычно это настройка в config/environments/*.rb. Конфигурационные файлы для последних версий на самом деле по умолчанию имеют значение false для производства, так что вместо них Apache / NGINX обслуживает файлы.

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

Rails 4 & 5

Rails.application.configure do
  config.serve_static_files = false 
end

Rails 6

Rails.application.configure do
    # Disable serving static files from the `/public` folder by default since
    # Apache or NGINX already handles this.
    config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
end

Это из сгенерированного файла config/environments/production.rb, и по умолчанию вы можете видеть значение false, если не задано env var RAILS_SERVE_STATIC_FILES (фактическое значение env var не имеет значения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...