0

我正在学习 Hartl 的 Ruby on Rails 教程,偶然发现了一个与开发和测试环境的运行方式不同有关的问题。

简单地说,两个环境不同步。开发环境似乎正常工作,但正在进行的一些更改并未传播到测试环境。

例如,在 application.html.erb 中进行编辑将导致在测试环境中复制该更改。但是,对 _header.html.erb 进行更改不会。这就是我注意到问题的方式 - 测试是否存在指向标题的新链接失败,而我在浏览器中(在开发环境中)盯着它们。

在试图解决这个问题时,我发现了另一个怪癖:如果我在测试环境中使用 运行本地服务器rails server --environment test,并启动浏览器,应用程序仍然是“固定的”。我的意思是,对应用程序代码或 HTML/CSS 文件所做的任何更改都不会在浏览器中复制。为了查看任何更改,必须关闭本地服务器,然后重新打开。然后,这会加载测试环境,其中包含可见的更改。

这两个环境数据库是相同的(我已经运行rake db:migraterake db:test:prepare在整个教程中添加迁移,并通过 sqlite 3 查看器确认数据库是相同的)。

我想这个问题源于我对 Rails 环境的一些基本误解 - 任何帮助将不胜感激。

为了完整起见,当我第一次注意到这个问题时,我正在完成第 8 章(添加登录/注销身份验证)。

4

2 回答 2

2

通常,生产环境中的 rails 不提供静态文件(例如 HTML 和 CSS),如果你想这样做你应该在 production.rb 中这样说:

 config.serve_static_assets = true

但是,如果您运行生产,您应该使用 Apache 或 NginX 等网络服务器运行它,在这种情况下,它们负责提供静态文件。

于 2013-01-30T08:12:59.060 回答
0

您注意到不同环境有不同的行为是正确的。只有开发环境会在每次浏览器请求时重新加载应用程序。测试和生产环境基本上缓存了 app 目录中的所有内容(参见这个 SO 答案)——基本上,它们只记得服务器启动时的代码版本。这样做是为了提高性能和/或减少波动性。表现是有道理的,但波动性可能需要更多解释。

假设您同时运行测试和编辑代码。测试将运行您运行测试之前的代码版本,而不是您之后所做的任何更改。在测试期间重新加载资产就像在高速公路上拆开一辆时速 60 公里的汽车。根据你要拆开的东西,它可能会产生很多意想不到的后果。可能不是灾难性的,但至少可能会危及运行测试。

如果您的问题是您的测试失败,因为它们没有针对最新版本的代码运行,那么您可能会遇到缓存问题 - 特别是如果您使用的是 spork,这是我上次看到的 Hartl 的 Rails 教程推荐的。您可能需要简单地重新启动 spork。

于 2013-03-19T02:17:31.690 回答