5

我按照 RailsTutorial.org 第 3 版(刚刚发布的版本)中的说明安装了 Rails 4.2.0.beta2。我没有使用 cloudIDE,而是在带有 RVM 的 Windows 7 主机上通过 Vagrant 使用 Ubuntu Trusty 32。

做了rails _4.2.0.beta2_ new hello_app然后粘贴在他的 gemfile 示例中

之后,我跑了:

$ bundle install
$ rails s

服务器启动正常,但是当我尝试连接时,localhost:3000我得到“找不到服务器”

更奇怪的是,我还有其他几个 Rails 入门项目,我一直在修补它们,使用 Rails 4.0.3 和 4.1.6,我能够很好地连接到那里的服务器。

我在这里想念什么?为什么当我使用最新版本创建了一个新的 Rails 项目时,我的浏览器无法连接,但它在旧版本中运行良好?

此外,我尝试wget http://0.0.0.0:3000连接并收到 200 响应,但长度未指定,而在旧版本下的另一个全新 Rails 应用程序中,我会得到实际文件大小index.html

4

4 回答 4

17

关于无法访问的服务器,来自 Rails 4.2发行说明

3.3 rails 服务器的默认主机

由于 Rack 的变化,rails 服务器现在侦听 localhost 而不是0.0.0.0默认情况下。这对标准开发工作流程的影响应该很小,http://127.0.0.1:3000并且http://localhost:3000会像以前一样在您自己的机器上继续工作。

然而,随着这一改变,您将不再能够从不同的机器访问 Rails 服务器(例如,您的开发环境在虚拟机中,而您希望从主机访问它),您需要启动服务器与rails server -b 0.0.0.0恢复旧的行为。

如果这样做,请务必正确配置防火墙,以便只有网络上受信任的机器才能访问您的开发服务器。

127.0.0.1:3000将只允许来自该地址在端口 3000 上的连接,而0.0.0.0:3000将允许来自任何地址在端口 3000 上的连接。

由于 Rails 4.2 默认只接受来自 localhost 的连接,因此您只能从 localhost 访问服务器(例如,在 VM 内部);来自另一台机器(例如 VM 的主机)的连接将不起作用。

您必须使用上述“旧行为”方法来允许来自 VM 主机的连接。


关于未指定的内容长度,这取决于使用的 Web 服务器。我假设它使用不发送内容长度的分块编码。资产将具有内容长度,但没有 HTML。

于 2014-10-26T12:32:16.310 回答
4

Rails 4.2 默认绑定到127.0.0.1:3000,而不是0.0.0.0:3000早期版本。如果您有其他 Rails 项目正在使用您的配置,请尝试使用显式 host: 启动服务器rails s -b 0.0.0.0

于 2014-10-26T09:53:39.267 回答
3

一个名叫tostasqb的人在github上发布了一个非常有趣的解决方法,以使旧行为(Rails 版本 < 4.2)成为默认行为。

只需编辑您的 config/boot.rb 文件并添加以下行:

require 'rubygems'
require 'rails/commands/server'

module Rails
  class Server
    alias :default_options_alias :default_options
    def default_options
      default_options_alias.merge!(:Host => '0.0.0.0')
    end
  end
end
于 2015-02-17T01:18:13.887 回答
0

将您的 gemfile 修改为类似的内容并运行捆绑更新。您指定的版本是明确的。如果我没有粘贴到您的 gemfile 中,新的 hello_world 对我有用。

gem 'rails', '~> 4.2.0.beta2'
gem 'pg'
gem 'bootstrap-sass', '~> 3.2.0'
gem 'sass-rails', '~> 5.0.0.beta1'
gem 'font-awesome-sass', '~> 4.2.0'
gem 'sprockets-rails', '~> 3.0.0.beta1'
gem 'coffee-rails', '~> 4.0.0'
gem 'uglifier', '>= 1.0.3'
于 2014-10-26T07:12:19.527 回答