Heroku: таблица стилей и Javascripts не обновляются для приложения Rails 5

За многие годы было много вопросов, когда у людей возникла эта проблема. Я пробовал комбинацию ответов, но я все еще не могу загрузить обновленную таблицу стилей и javascript в своем приложении Rails 5.1.6 в Heroku. Он работает на моей локальной машине.

Вот мои файлы.

приложение/активы/таблицы стилей/application.scss

*= require_tree .
*= require_self

app/views/layouts/application.html.erb

<html>
    <head>
      ......
      <%= stylesheet_link_tag    "application", media: "all" %>
      <%= csrf_meta_tags %>
      <%= favicon_link_tag "/favicon.ico" %>
      <%= render 'layouts/shim' %>
    </head>
    <body>
      ......
      <%= debug(params) if Rails.env.development? %>
      <%= javascript_include_tag "application" %>
    </body>
</html>

config/application.rb

require_relative 'boot'

require 'rails/all'

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module EzklwRor
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 5.1

    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.

    RouteTranslator.config do |config|
      config.generate_unnamed_unlocalized_routes = true
      config.locale_param_key                    = :locale
    end

    config.exceptions_app = self.routes     
    config.action_dispatch.default_headers = { 'X-Frame-Options' => 'ALLOWALL' }
  end
end

config/environments/production.rb

Rails.application.configure do
  # Settings specified here will take precedence over those in config/application.rb.

  # Code is not reloaded between requests.
  config.cache_classes = true

  # Eager load code on boot. This eager loads most of Rails and
  # your application in memory, allowing both threaded web servers
  # and those relying on copy on write to perform better.
  # Rake tasks automatically ignore this option for performance.
  config.eager_load = true

  # Full error reports are disabled and caching is turned on.
  config.consider_all_requests_local       = false
  config.action_controller.perform_caching = true

  # We are using Rails ActionMailers in this application
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    domain:               'www.mydomain.com',
    address:              ENV["SMTPADDRESS"],
    port:                 587,
    user_name:            ENV["SMTPUSERNAME"],
    password:             ENV["SMTPPASSWORD"],
    authentication:       'plain' }

  config.action_mailer.perform_deliveries = true
  config.action_mailer.raise_delivery_errors = true

  # Attempt to read encrypted secrets from `config/secrets.yml.enc`.
  # Requires an encryption key in `ENV["RAILS_MASTER_KEY"]` or
  # `config/secrets.yml.key`.
  config.read_encrypted_secrets = true

  # 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?

  # Compress JavaScripts and CSS.
  config.assets.js_compressor = :uglifier
  # config.assets.css_compressor = :sass

  # Do not fallback to assets pipeline if a precompiled asset is missed.

  config.serve_static_assets = true

  config.assets.compile = true 

  config.assets.digest = true

  # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb

  # Enable serving of images, stylesheets, and JavaScripts from an asset server.
  # config.action_controller.asset_host = 'http://assets.example.com'

  # Specifies the header that your server uses for sending files.
  # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache
  # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX

  # Mount Action Cable outside main process or domain
  # config.action_cable.mount_path = nil
  # config.action_cable.url = 'wss://example.com/cable'
  # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ]

  # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
  config.force_ssl = true

  # Use the lowest log level to ensure availability of diagnostic information
  # when problems arise.
  config.log_level = :debug

  # Prepend all log lines with the following tags.
  config.log_tags = [ :request_id ]

  # Use a different cache store in production.
  # config.cache_store = :mem_cache_store

  # Use a real queuing backend for Active Job (and separate queues per environment)
  # config.active_job.queue_adapter     = :resque
  # config.active_job.queue_name_prefix = "ezklw_#{Rails.env}"
  config.action_mailer.perform_caching = false

  # Ignore bad email addresses and do not raise email delivery errors.
  # Set this to true and configure the email server for immediate delivery to raise delivery errors.
  # config.action_mailer.raise_delivery_errors = false

  # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
  # the I18n.default_locale when a translation cannot be found).
  config.i18n.fallbacks = [I18n.default_locale]

  # Send deprecation notices to registered listeners.
  config.active_support.deprecation = :notify

  # Use default logging formatter so that PID and timestamp are not suppressed.
  config.log_formatter = ::Logger::Formatter.new

  # Use a different logger for distributed setups.
  # require 'syslog/logger'
  # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name')

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

  # Do not dump schema after migrations.
  config.active_record.dump_schema_after_migration = false
end

Вот что я сделал на своей локальной машине.

rake assets:clean

rake assets:precompile

rake assets:precompile RAILS_ENV=production

committed changes with public/assets folder included using Github desktop app

git push heroku master

git push heroku master -f when initial change did not work after adding spaces to a file to avoid everything-up-to-date message.

heroku rake assets:precompile RAILS_ENV=production

heroku restart several times along the way

heroku repo:clone -a myapp to verify that my app/assets folder was up to date

heroku repo:reset -a myapp to empty the heroku repo

git push heroku master

heroku logs -t

Я несколько раз очищал кеш в своем браузере, перезагружал компьютер и отображал новое приложение на разных устройствах. Я не вижу ошибок в журнале heroku. Мои css и js не работают. Где еще я могу посмотреть, чтобы исправить это?


person Pamela Cook - LightBe Corp    schedule 19.03.2019    source источник
comment
Не могли бы вы поделиться с нами переменными среды?   -  person Berkhan Berkdemir    schedule 19.03.2019
comment
@BerkhanBerkdemir, обязательно буду. Какие переменные вы ищете?   -  person Pamela Cook - LightBe Corp    schedule 19.03.2019
comment
Памела, покажи файлы config/environments/production.rb и application.rb.   -  person Tom Connolly    schedule 20.03.2019
comment
@TomConnolly, я обновил свой вопрос.   -  person Pamela Cook - LightBe Corp    schedule 20.03.2019


Ответы (1)


Я проверил ваши файлы конфигурации, и в config/environments/production.rb у вас ошибка с config.serve_static_assets = true; поэтому вам нужно было изменить на config.public_file_server.enabled = true, а также, пожалуйста, измените config.assets.compile = false, потому что я не думаю, что вы хотите компилировать ресурсы с каждым запросом.

Вот аналогичное использование: config/environments/production.rb

Для получения дополнительной информации проверьте те же вопросы и ответы: https://stackoverflow.com/a/54376240/8929392

person Berkhan Berkdemir    schedule 20.03.2019
comment
Это не работает. В итоге я создал новое приложение Rails 5.2, скопировал код, который у меня был, и создал новое приложение Heroku. Мой код теперь работает так, как ожидалось. Я добавил serve_static_assets, как было предложено в другом вопросе, который не сработал. У меня было config.serve_static_assets = true, потому что Heroku не обновлял мои CSS и JS без него, даже если общая папка была включена в мой репозиторий git. Я пришел к выводу, что проблема заключалась в сбое в этом конкретном приложении Heroku. - person Pamela Cook - LightBe Corp; 21.03.2019
comment
Новый Rails 5.2 поставляется с наборами config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? и наборами Heroku RAILS_SERVE_STATIC_FILES=enabled. Именно поэтому проблема была исправлена. Впрочем, я могу ошибаться. - person Berkhan Berkdemir; 21.03.2019
comment
Berkham, более поздние версии 5.1 имеют config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?. Я никогда ничего не делал с этим. Я только что попытался изменить CSS на другие приложения 5.1, и у меня была такая же проблема с обновлениями CSS. Я обновил его до 5.2, и мой CSS работает в Heroku. Интересно, проблема в стеке Heroku? Мои текущие приложения Heroku работают под управлением Heroku-16. Новые по умолчанию — новый Heroku-18. Для будущих изменений сценария или CSS я обновлю свои приложения 5.1 до 5.2 и создам новые приложения Heroku. Мне не нужно много менять, чтобы заставить их работать. - person Pamela Cook - LightBe Corp; 22.03.2019