如何确定Rails是否处于生产模式?

94

我使用了script/server -e production来启动Rails的生产模式,没有出现错误。但是如何确定它是否处于生产模式下呢?我试图访问一个不存在的路由,却得到了类似于在开发中得到的错误页面。

我认为如果处于生产模式下,我会得到我的`/public`文件夹中的404错误页面。

这是不是意味着它并没有以生产模式启动呢?

感谢您的帮助!

6个回答

253

如果使用的是Rails 3.1+,Rails.env.production?在生产环境下会返回true

Rails.env.production?  #=> true  
Rails.env.staging?     #=> false
Rails.env.development? #=> false  

2
通过 rails c 运行的命令 >> Rails.env 似乎可以显示任何环境模式。 - originalhat
1
一切带有问号的内容都是可用的。Rails.env 是一个由 ActiveSupport::StringInquirer 装饰的字符串。http://api.rubyonrails.org/classes/ActiveSupport/StringInquirer.html - Sebastian vom Meer
只是一条注释,这也适用于Rails控制台。在生产服务器上,我能够运行:rails console,然后执行上面的命令。 - Ryan

38

对于现代的 Rails 版本(3+),Rails.env 返回一个 String 类型的环境变量:

Rails.env #=> "production"

每个环境还有一个有用的访问器,它将返回一个 Boolean 值:

Rails.env.production?  #=> true  
Rails.env.staging?     #=> false
Rails.env.development? #=> false

(*) 这里有一个“小陷阱”:这些不是真正的访问器。它们只是一些字母字符串,如果它们恰好与当前环境名称匹配,则返回true。它们会默默失败。这意味着您可能处于生产环境中,但如果此代码中有拼写错误,则您将不会收到错误消息,而是会简单地得到false

Rails.env.producton?  #=> false

出于这个原因,我在初始化器中设置常量,并且只在我的代码的其余部分中引用它们。这使得 Ruby 解释器能够帮助我捕捉自己的错误:

PRODUCTION = Rails.env.production?
DEVELOPMENT = Rails.env.development?
TEST = Rails.env.test?

34

有两种简单的方法:

tail -f log/production.log

如果在你启动应用后,日志中有条目,那么你就处于生产模式。

第二种方式:

在你的视图中的任意一个位置(通常是布局比较好),只需添加下面的代码:

<%= "Environment: #{RAILS_ENV}" %>

这将向您展示您正在运行的环境。

编辑

如果请求被视为“本地”(即来自localhost或127.0.0.1),则在任何环境下,您将看到默认的异常页面而不是实际的错误页面。您可以通过向 ApplicationController 中添加以下内容来覆盖此行为。

def local_request?
  false
end

你可以在文档的API中找到这个方法。


我无法让第二种方法起作用,但是我的production.log中有条目表明我在X时间创建了一个任务。那么为什么我没有得到正确的404错误页面呢?我需要在某个地方指定提供正确的错误页面吗?感谢您的帮助。 - sent-hil
我在我的视图中遇到了一个错误,不得不使用@Krishnaprasad的方法。 - Besi
8
иЇ·жіЁж„ЏпјЊRAILS_ENVе·ІдёЌжЋЁиЌђдЅїз”ЁгЂ‚ иЇ·ж”№з”ЁRails.envгЂ‚ - Soullivaneuh

8
在您的命令行中输入rails console,然后输入Rails.env

3

我发现重新启动rails服务器并读取命令行的第二行要容易得多:

运行rails s -e production会输出:

=> Booting Puma
=> Rails 4.2.4 application starting in `production` on http://localhost:3000

在示例中我们使用了Webrick,但有些人不理解如何更改服务器名称。为了更清晰地说明,进行了更新。


8
没有理智的人会在生产环境中使用 WEBrick - Hauleth
Hauleth 是绝对正确的。这只是为了测试您在开发过程中所处的环境。 - bkunzi01
如果这个回答是恶作剧,那它就是高超的!恭喜! - JD.

-2
命令行替代方案 $echo $RAILS_ENV

如果服务器是使用内联ENV变量启动的,则此方法将无效。 话虽如此,如果确实这样做了,那么脚本/别名/等应该存在于磁盘上的某个位置,其中将包括RAILS_ENV变量。 可以搜索磁盘以查找它,例如使用ack - New Alexandria
这个不起作用...变量里是什么,它是如何获取环境的? - z atef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接