Javascript 在 Heroku 上的全新 Rails 5.2.1 应用程序无法正常运行

Javascript in a fresh Rails 5.2.1 app on Heroku doesn't work properly

我认为在 Heroku 的生产环境中 Rails 5 个应用程序中的 JavaScript 个文件存在很大问题。虽然它在本地工作

我的配置:

Windows:   10 Education
Rails:     5.2.1
Ruby:      2.4.4p296
Heroku:    heroku/7.7.7 win32-x64 node-v10.7.0
postgres:  postgres (PostgreSQL) 10.3

现在我将向您展示我为确认它不起作用而执行的步骤,您可以自己尝试。最后,您将有一个 link 到 bitbucket 存储库和 Heroku 上的应用程序。

第一步:新建Rails5 App并切换到根文件夹

> rails new my_app --database=postgresql
> cd my_app

第 2 步:生成控制器

> rails generate controller static_pages

第 3 步:编辑 /app/controllers/static_pages_controller 文件

class StaticPagesController < ApplicationController
  def show
  end

  def destroy
  end
end

第 4 步:创建要与操作一起显示的视图

/app/views/static_pages/show.html.erb :

this is the show view

here is a link to the delete action:

<%= link_to t('logout'), logout_path, method: :delete %>

/app/views/static_pages/destroy.html.erb :

this is the destroy view which is called with a link_to method: :delete

第 5 步:编辑 /config/routes.rb 文件

Rails.application.routes.draw do
  root 'static_pages#show'
  get 'static_pages/show'
  delete '/logout', to: 'static_pages#destroy'
end

第 6 步:检查路由

> rails routes
                   Prefix Verb   URI Pattern                                                                              Controller#Action
                     root GET    /                                                                                        staticpages#show
         staticpages_show GET    /staticpages/show(.:format)                                                              staticpages#show
                   logout DELETE /logout(.:format)                                                                        staticpages#destroy
       rails_service_blob GET    /rails/active_storage/blobs/:signed_id/*filename(.:format)                               active_storage/blobs#show
rails_blob_representation GET    /rails/active_storage/representations/:signed_blob_id/:variation_key/*filename(.:format) active_storage/representations#show
       rails_disk_service GET    /rails/active_storage/disk/:encoded_key/*filename(.:format)                              active_storage/disk#show
update_rails_disk_service PUT    /rails/active_storage/disk/:encoded_token(.:format)                                      active_storage/disk#update
     rails_direct_uploads POST   /rails/active_storage/direct_uploads(.:format)                                           active_storage/direct_uploads#create

第 7 步:创建数据库并迁移

> rails db:create
Created database 'my_app_development'
Created database 'my_app_test'

> rails db:migrate

第八步:启动服务器

> rails server

第9步:前往localhost:3000/并点击出现的link。 link 工作并向服务器发送删除操作

Started GET "/" for 127.0.0.1 at 2018-09-03 18:43:52 +0200
Processing by StaticPagesController#show as HTML
  Rendering static_pages/show.html.erb within layouts/application
  Rendered static_pages/show.html.erb within layouts/application (12.2ms)
Completed 200 OK in 504ms (Views: 486.7ms | ActiveRecord: 0.0ms)


Started DELETE "/logout" for 127.0.0.1 at 2018-09-03 18:43:57 +0200
Processing by StaticPagesController#destroy as HTML
  Parameters: {"authenticity_token"=>"10NHmV8N4tF3O0r/YYtKtKmHm3xthGjPAE51osb7L9skCM5ZoM2RoiCtZD4Crh9d69ndTOeNRMmIW28ipI/z9A=="}
  Rendering static_pages/destroy.html.erb within layouts/application
  Rendered static_pages/destroy.html.erb within layouts/application (0.0ms)
Completed 200 OK in 90ms (Views: 73.0ms | ActiveRecord: 0.0ms)

第 10 步:创建一个 heroku 应用程序(您必须在您的系统上登录到 heroku)

> heroku create

第 11 步:将您的工作推送到 Heroku

> git add -A
> git commit -m "init"
> git push --set-upstream heroku master

第 12 步:打开您的 Heroku 应用程序并按照第 9 步中的操作操作但失败,因为 JavaScript 似乎无法正常工作

(...) Started GET "/" for 84.147.254.28 at 2018-09-03 16:47:44 +0000
(...) Processing by StaticPagesController#show as HTML
(...)   Rendering static_pages/show.html.erb within layouts/application
(...)   Rendered static_pages/show.html.erb within layouts/application (9.2ms)
(...) Completed 200 OK in 27ms (Views: 13.7ms)
.
.
. 
(...) Started GET "/logout" for 84.147.254.28 at 2018-09-03 16:48:05 +0000
(...) ActionController::RoutingError (No route matches [GET] "/logout"):

这是 Rails 或 Heroku 方面的一个明显错误,如您所见,我所做的只是创建一个新的 rails 应用程序并更改路由,生成一个控制器并制作 2控制器操作的视图。

如果您想查看应用程序的所有来源以及部署到 heroku 的应用程序,请在此处 links。

你可以在这里查看源代码:BitBucket Repo

这里的应用程序:Heroku app

有没有其他人在使用 Rails 和 Heroku 时遇到这种困难,或者我可以做些什么来让它工作?

编辑:通过删除不必要的日志信息和时间戳使第 12 步的输出更清晰

问题是 duktape gem。这是一个 Javascript 引擎,在 Rails 世界中没有广泛使用,但默认情况下包含在新的 Windows rails 安装中,因为它是唯一的引擎之一实际上在 Windows 工作。 (如果你现在还没有弄清楚,那么 Rails windows 开发人员并不多 :))。

我不认为 Heroku 对它有很好的支持,所以当它选择那个引擎时,JS 默默地编译失败​​。如果您在生产环境中查看 application.js 文件,您会看到一堆 NaN: "select[data-remote], input[data-remote], textarea[data-remote]", at the top, when you should see things like inputChangeSelector: "select[data-remote], input[data-remote], textarea[data-remote]"`.

如果你想让它正常工作,将 Duktape gem 从它的当前位置移到你的 Gemfile 的 development 部分,捆绑并重新部署(你可以避免现在主 Gemfile 中的 JS 编译器。

我也会用 Heroku 开票。通常,他们会警告您此类常见配置问题,但当我尝试部署您的应用程序时,我没有收到此类警告。我想很多用户都没有想到。

我解决了我的问题:导致问题的是 uglifier gem,因为它无法正常工作。我只是一个初学者,回想起来这个 gem 应该是我需要检查的第一件事,因为它会进行 JS 压缩。

现在 JS 运行良好。这是我在 GemFile 中为使其工作所做的更改:

来自

gem 'uglifier', '>= 1.3.0'

gem 'uglifier', '~> 3.0.4'

uglifier gem 版本 4.1.18 在生产环境中导致此 JS 错误。

希望这可以帮助其他人确定他们在 Heroku 上的 JS 错误