【问题标题】:Foundation/Jquery not working in Production env, works in developmentFoundation/Jquery 不在生产环境中工作,在开发中工作
【发布时间】:2018-08-10 12:40:30
【问题描述】:

我正在开发一个托管在 Heroku 上的 Ruby on Rails Web 应用程序。我正在使用 Zerb Foundation 5 进行样式设置,它在开发环境中运行良好。如果我将环境更改为生产环境并重新启动服务器,Foundation 组件将无法正确呈现。我相信这是一个 Jquery 问题。以下是下拉列表的外观/在生产环境中如何显示的示例:

working dropdown

not working dropdown

在生产中运行时出现以下错误:

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

生产数据库已创建并播种。我对环境配置文件进行了一些修改以尝试调试此问题。由于问题仅在生产中,因此对我来说这就是问题的来源是有意义的。

config/environments/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(); });
});

通过研究,我遇到此错误的可能原因是:

  • 多个 Foundation 内含物
  • uglifier 的一些错误导致变量名更改为“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,看看您是否可以在本地触发故障。
  • "Boolean Number String Function Array Date RegExp Object Error Symbol" 确实出现在jQuery core source code 中,所以我预计资产压缩会导致此问题。
  • @AaronBreckenridge 我不知道 ht 是什么,我认为它来自 jquery,因为这似乎是问题所在。运行它并重新启动开发 Rails 服务器,它仍然可以正常呈现。还尝试清除缓存并手动删除资产,但两者都没有任何影响:/
  • 资产压缩是否在开发中?如果是,您应该在 config/environments/development.rb 中看到 config.assets.js_compressor = :uglifier。 (见stackoverflow.com/a/44265553/717626
  • @AaronBreckenridge 我从 application.js 中删除了//= require rails-ujs,它现在可以工作了。我会将其发布为答案并解决此问题,感谢您的帮助:)

标签: ruby-on-rails ruby heroku zurb-foundation


【解决方案1】:

简单修复:

javascripts/applciation.js

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

预编译的资产,现在可以正常工作了。

【讨论】:

    【解决方案2】:

    production.rb:

    1. 我评论这一行:config.assets.js_compressor = :uglifier
    2. 设置为假:config.assets.compile = false
    3. 在控制台中运行:bundle exec rake assets:clean RAILS_ENV=productionbundle exec rake assets:precompile RAILS_ENV=production
    4. 重启服务器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-16
      • 2017-07-15
      • 1970-01-01
      • 2021-06-17
      • 2015-05-15
      • 1970-01-01
      • 2017-07-04
      • 1970-01-01
      相关资源
      最近更新 更多