如何在没有内部服务器错误的情况下让Ruby的Regexp在Heroku中工作?

时间:2018-05-05 06:18:38

标签: ruby heroku sinatra

我有这个程序,我设法上传到heroku没有错误。但是当我在浏览器中打开它时,如果我在那里使用Regexp,我会得到“内部服务器错误”。如果我发表评论就可以了。

我看过类似的关于Heroku的标题性问题,提出“内部服务器错误”,但它们并不涉及Regexp,并且他们没有给我任何关于我需要做些什么以使其工作的想法。例如Heroku deployment internal server error该人正在使用python,他安装的软件包是不兼容的,这似乎与我的问题无关。这个Heroku + Django Internal server Error一个人必须导入一个叫做djcelery的东西。好吧,也许我必须在某处导入某些东西,但我不知道是什么,但它不会是djcelery'因为我不使用django。

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

C:\rubytest\regexinheroku1>

这里是aaa.rb

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

这是问题

如果我转到该网址,则显示“内部服务器错误”

enter image description here

但是,如果我通过注释掉正则表达式行来改变aaa.rb

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

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

然后它工作正常,页面出现并按预期说“aaaa”。

如果你想重现这个并且以上是不够的,这里是所有步骤

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 :(得分:2)

与所有错误一样,首先要做的是检查日志。日志应该(几乎)总是提供比错误的更好的线索,而不是通用的内部服务器错误"这是面向公众的。

但是,在这种情况下,我几乎可以肯定问题是您的本地计算机正在使用 ruby​​版本>= 2.4.0 (可能是2.5.1,这是最新的?),而heroku正在运行 ruby​​版本2.3.7 。来自the documentation

  

如果您的Gemfile不包含ruby条目,则会在MRI 2.3.7Cedar-14堆栈上获得Heroku-16。在Heroku-18,您将获得MRI 2.4.4

要解决此问题,我建议包括:

ruby '2.5.1'
{p>(或您正在使用的任何版本)Gemfile。这是一般的好习惯,因为它可以确保您的本地和生产环境相同。

具体来说,这里的实际问题是Ruby 2.4.0 added the method Regexp#match?。所以Heroku目前正在抛出一种未知的方法"错误。