Как мне заставить Ruby's Regexp работать в Heroku без внутренней ошибки сервера? - PullRequest
0 голосов
/ 05 мая 2018

У меня есть эта программа, которую мне удалось загрузить в heroku без ошибок. Но когда я открываю его в браузере, то, если я сохраняю строку, использующую Regexp, я получаю «внутреннюю ошибку сервера». Если я это прокомментирую, это нормально.

Я смотрел на одноименные вопросы о том, как Heroku дает «внутреннюю ошибку сервера», но они не связаны с Regexp, и они не дали мне никаких идей относительно того, что мне нужно сделать, чтобы это работало. Например, Внутренняя ошибка сервера развертывания Heroku человек использовал python, и пакет, который он установил, был несовместим, что не имеет отношения к моей проблеме. Этот Heroku + Django Внутренняя ошибка сервера парень должен был импортировать нечто, называемое djcelery. Ну, может быть, мне нужно куда-то импортировать, но я не знаю что, но это не было бы djcelery, потому что я не использую django.

C:\rubytest\regexinheroku1>dir /b
aaa.rb
config.ru
Gemfile
Gemfile.lock

C:\rubytest\regexinheroku1>

вот ааа.рб

C:\rubytest\regexinheroku1>type aaa.rb
require 'sinatra'

get '/' do
z=Regexp.new('.').match?('qwerty')   
"aaaa"
end

Это успешно

C:\rubytest\regexinheroku1>git push heroku master

.... deployed to Heroku

Вот проблема, хотя

Если я перейду к URL-адресу, появится сообщение «Внутренняя ошибка сервера»

enter image description here

Однако, если я изменю aaa.rb, закомментировав строку регулярного выражения

C:\rubytest\regexinheroku1>type aaa.rb
require 'sinatra'

get '/' do
# z=Regexp.new('.').match?('qwerty')   
"aaaa"
end

Тогда все работает нормально, появляется страница и говорит «аааа», как и ожидалось.

Если вы хотите воспроизвести это, а вышеперечисленного недостаточно, вот все шаги

So you see the files

C:\rubytest\regexinheroku2>dir /b
aaa.rb
config.ru
Gemfile

The contents of each file 

C:\rubytest\regexinheroku2>type aaa.rb
require 'sinatra'

get '/' do
z=Regexp.new('.').match?('qwerty')  # if I uncomment this, I get internal server error
"aaaa"
end


C:\rubytest\regexinheroku2>type config.ru
require './aaa'
run Sinatra::Application
C:\rubytest\regexinheroku2>

C:\rubytest\regexinheroku2>type Gemfile
source "http://rubygems.org/"
gem 'sinatra'
gem "haml"

And see the commands I run to get the application successfully deployed

C:\rubytest\regexinheroku2>bundle install
...

C:\rubytest\regexinheroku2>git init
Initialized empty Git repository in C:/rubytest/regexinheroku2/.git/

C:\rubytest\regexinheroku2>git add -A
warning: LF will be replaced by CRLF in Gemfile.lock.
The file will have its original line endings in your working directory.

C:\rubytest\regexinheroku2>git commit -m "sddsfsdfsd"
[master (root-commit) 12cf382] sddsfsdfsd
warning: LF will be replaced by CRLF in Gemfile.lock.
The file will have its original line endings in your working directory.
 4 files changed, 39 insertions(+)
 create mode 100644 Gemfile
 create mode 100644 Gemfile.lock
 create mode 100644 aaa.rb
 create mode 100644 config.ru

C:\rubytest\regexinheroku2>heroku create
path1 gitmisc done
Creating app... done,   abc
https://abc.herokuapp.com/ | ....

C:\rubytest\regexinheroku2>git push heroku master
....
remote: Verifying deploy... done.
To https://git.heroku.com/abc.git
 * [new branch]      master -> master

C:\rubytest\regexinheroku2>

1 Ответ

0 голосов
/ 05 мая 2018

Как и во всех ошибках, первое, что нужно сделать, это проверить журнал . Журнал должен (почти) всегда давать лучшую подсказку об ошибке, чем общая «внутренняя ошибка сервера», которая является общедоступной.

Однако в этом случае я почти уверен, что проблема в том, что ваша локальная машина использует версию ruby ​​>= 2.4.0 (возможно, 2.5.1, что является последним?), Тогда как heroku работает ruby ​​version 2.3.7. С документация :

Если ваш Gemfile не содержит рубиновую запись, вы получите MRI 2.3.7 на Cedar-14 и Heroku-16 стеках. На Heroku-18 вы получите MRI 2.4.4.

Чтобы это исправить, я бы порекомендовал включить:

ruby '2.5.1'

(или любую версию, которую вы используете) в Gemfile. В целом это хорошая практика, поскольку она обеспечивает одинаковую локальную и производственную среду.

Фактическая проблема здесь, если быть точным, в том, что Ruby 2.4.0 добавил метод Regexp#match?. Поэтому Heroku в настоящее время выдает ошибку «неизвестный метод».

...