Foundation / jquery не работает в производственной среде, работает в разработке

Я разрабатываю веб-приложение Ruby on Rails, которое размещается на Heroku. Я использую Zerb Foundation 5 для стилизации, которая отлично работает в среде разработки. Если я изменю среду на рабочую и перезапущу сервер, компоненты Foundation будут отображаться неправильно. Я считаю, что это проблема JQuery. Вот пример того, как должны выглядеть выпадающие списки / как они отображаются в рабочей среде:

рабочий раскрывающийся список

не работает раскрывающийся список

При запуске в производство я получаю следующую ошибку:

Uncaught TypeError: ht.each is not a function
at VM417 application-d4dfc26bd5c2527cd0b1b3ce283f89526f6a65ed0527799d75ae98ccd0415867.js:1
at VM417 application-d4dfc26bd5c2527cd0b1b3ce283f89526f6a65ed0527799d75ae98ccd0415867.js:1
at VM417 application-d4dfc26bd5c2527cd0b1b3ce283f89526f6a65ed0527799d75ae98ccd0415867.js:1

что приводит меня к этой строке:

"function" == typeof Symbol && (ht.fn[Symbol.iterator] = nt[Symbol.iterator]),
ht.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), function(t, e) {
    lt["[object " + e + "]"] = e.toLowerCase()
});

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

$ rails assets:clean
$ RAILS_ENV=production bundle exec rails assets:precompile

Производственная база данных создана и заполнена. Я внес несколько изменений в файлы конфигурации среды, пытаясь устранить эту проблему. Поскольку проблема только в производстве, мне было понятно, что проблема возникла именно здесь.

конфигурация / среды / production.rb

Rails.application.configure do

  config.cache_classes = true

  config.eager_load = true

  config.consider_all_requests_local       = false
  config.action_controller.perform_caching = true

  config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?

  config.assets.js_compressor = :uglifier
  config.assets.digest = true

  config.assets.compile = true

  config.active_storage.service = :local

  config.log_level = :debug

  config.log_tags = [ :request_id ]

  config.action_mailer.perform_caching = false

  config.i18n.fallbacks = true

  config.active_support.deprecation = :notify

  config.log_formatter = ::Logger::Formatter.new

  if ENV["RAILS_LOG_TO_STDOUT"].present?
    logger           = ActiveSupport::Logger.new(STDOUT)
    logger.formatter = config.log_formatter
    config.logger    = ActiveSupport::TaggedLogging.new(logger)
  end

  config.active_record.dump_schema_after_migration = false
end

javascripts / applciation.js

//= require jquery
//= require rails-ujs
//= require turbolinks
//= require foundation
//= require_tree .

$(document).on('turbolinks:load', function() {
    $(function(){ $(document).foundation(); });
});

По результатам исследования, возможные причины этой ошибки, с которыми я столкнулся, следующие:

  • многократный включения фундамента
  • Некоторая ошибка с уродец, из-за которой имя переменной было изменено на "ht" (кажется маловероятным)
  • конфигурация производства не настроена правильно

Я проработал уроки heroku:

https://devcenter.heroku.com/articles/rails-asset-pipeline#troubleshooting

https://devcenter.heroku.com/articles/rails-4-asset-pipeline

Заранее спасибо и дайте мне знать, есть ли что-нибудь, что может помочь включить, я не хотел загромождать пост большим количеством кода, ха-ха :)

Есть идеи, что такое ht или что его обеспечивает? Однажды у меня была библиотека JS с недопустимым синтаксисом, которая сломалась только во время компиляции актива. Я понял это только удаляя активы по одному. Попробуйте выполнить RAILS_ENV=development rake assets:clobber assets:precompile на своей машине разработки, чтобы увидеть, можете ли вы вызвать сбой локально.

Aaron Breckenridge 10.08.2018 15:48
"Boolean Number String Function Array Date RegExp Object Error Symbol" действительно присутствует в исходный код ядра jQuery, поэтому я ожидаю, что сжатие ресурсов вызывает эту проблему.
Aaron Breckenridge 10.08.2018 15:52

@AaronBreckenridge Я понятия не имею, что такое ht, я предполагаю, что это что-то из jquery, поскольку это, похоже, проблема. Выполните это и перезапустите сервер рельсов разработки, и он все еще работает нормально. Также попытался очистить кеш и вручную удалить активы, ни один из которых не повлиял: /

Benjamin Shaffer 10.08.2018 16:04

Включено ли сжатие активов в разработке? Вы должны увидеть config.assets.js_compressor = :uglifier в config / environment / development.rb, если он есть. (См. stackoverflow.com/a/44265553/717626)

Aaron Breckenridge 10.08.2018 16:21

@AaronBreckenridge Я удалил //= require rails-ujs из application.js, и теперь он работает. Я отправлю это как ответ и решу это, спасибо за помощь :)

Benjamin Shaffer 10.08.2018 16:30
0
5
263
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Простое исправление:

В javascripts / application.js

- //= require rails-ujs
+ //= require jquery-ujs

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

В production.rb:

  1. Комментирую эту строчку: config.assets.js_compressor = :uglifier
  2. Установить ложь: config.assets.compile = false
  3. Запускаем в консоли: bundle exec rake assets:clean RAILS_ENV=production и bundle exec rake assets:precompile RAILS_ENV=production
  4. Перезагрузите сервер

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