Javascript в новом приложении Rails 5.2.1 на Heroku не работает должным образом - PullRequest
0 голосов
/ 03 сентября 2018

Я думаю, что есть большая проблема с файлами JavaScript в приложениях Rails 5 в производственной среде на Heroku. Работает локально, хотя

Моя конфигурация:

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

Теперь я представлю вам шаги, которые я сделал, чтобы подтвердить, что это не работает, и вы можете попробовать сами. В конце вы получите ссылку на репозиторий Bitbucket и приложение на Heroku.

Шаг 1. Создание нового приложения Rails 5 и переход в корневую папку

> 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

Шаг 8: запустить сервер

> rails server

Шаг 9: перейдите на localhost: 3000 / и щелкните по представленной ссылке. ссылка работает и отправляет действие удаления на сервер

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.

Вы можете проверить исходный код здесь: BitBucket Repo

И приложение здесь: Приложение Heroku

Кто-нибудь еще испытывает такие трудности с Rails и Heroku, или я могу что-нибудь сделать, чтобы это сработало?

РЕДАКТИРОВАТЬ : немного упростили вывод шага 12, удалив ненужную информацию журнала и отметки времени

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

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

Теперь JS работает отлично. Вот изменение, которое я сделал в GemFile, чтобы оно заработало:

От

gem 'uglifier', '>= 1.3.0'

до

gem 'uglifier', '~> 3.0.4'

Версия гема uglifier была 4.1.18, которая вызвала эту ошибку JS в производственной среде.

Надеюсь, это поможет другим зафиксировать свои ошибки JS на Heroku

0 голосов
/ 04 сентября 2018

Проблема - драгоценный камень duktape. Это движок 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 из его текущего места в секцию development вашего Gemfile, связывайте его и развертывайте заново (пока вы можете избежать JS-компилятора в основном Gemfile.

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

...