我使用Rails 4.1从头开始创建了一个Rails应用程序,我面临一个无法解决的奇怪问题.

每次我try 在Heroku上部署我的应用程序时,都会出现一个错误500:

Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml`

secret.yml文件包含以下配置:

secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

在Heroku上,我用rake secret命令的结果配置了"SECRET_KEY_BASE"环境变量.如果我启动heroku config,我可以看到具有正确名称和值的变量.

为什么我还是会犯这个错误?

推荐答案

我也遇到了同样的问题,并通过创建一个环境变量来解决,该变量将在每次登录到生产服务器时加载,并执行了mini-guide个配置步骤:

我在Unicorn v4上使用Rails 4.1.8.2当我试图部署我的应用程序时,它没有正确启动,在unicorn.log文件中,我发现了以下错误消息:

app error: Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml` (RuntimeError)

经过一些研究,我发现Rails 4.1改变了管理secret_key的方式,所以如果你阅读exampleRailsProject/config/secrets.yml中的secrets.yml文件,你会发现类似这样的东西:

# Do not keep production secrets in the repository,
# instead read values from the environment.
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

这意味着Rails建议您在生产服务器中为secret_key_base使用环境变量.为了解决这个错误,您应该按照以下步骤在生产服务器中为Linux(在我的例子中是Ubuntu)创建一个环境变量:

  1. 在生产服务器的终端中执行:

    $ RAILS_ENV=production rake secret
    

    这将返回一个包含字母和数字的大字符串.复制那个,我们称之为GENERATED_CODE.

  2. 登录到你的服务器

    • 以root用户身份编辑该文件,如果您找到该用户:

      $ vi /etc/profile
      

      使用vi中的Shift+G(大写字母"G")转到文件底部.

      GENERATED_CODE写下你的环境变量,按i在vi中插入.确保在文件末尾的新行中:

      $ export SECRET_KEY_BASE=GENERATED_CODE
      

      保存更改并使用Esc关闭文件,然后输入":x"和保存并退出vi.

    • 但是,如果您以普通用户身份登录,我们将其称为"example_user",以了解这一要点,您将需要找到以下其他文件之一:

      $ vi ~/.bash_profile
      $ vi ~/.bash_login
      $ vi ~/.profile
      

      这些文件按重要性排序,这意味着如果你有第一个文件,那么你就不需要编辑其他文件.如果在目录~/.bash_profile~/.profile中找到这两个文件,只需在第一个~/.bash_profile中写入,因为Linux将只读取这一个,而忽略另一个.

      然后我们再次使用Shift+G进入文件的底部,再次使用i写入环境变量,并确保在文件末尾添加一行新行:

      $ export SECRET_KEY_BASE=GENERATED_CODE
      

      编写代码后,保存更改并再次使用Esc关闭文件,然后使用":x"和Enter键保存并退出.

  3. 您可以使用以下命令验证我们的环境变量是否在Linux中正确设置:

    $ printenv | grep SECRET_KEY_BASE
    

    或者:

    $ echo $SECRET_KEY_BASE
    

    当你执行这个命令时,如果一切正常,它会显示之前的GENERATED_CODE.最后,完成所有配置后,您应该能够使用Unicorn或其他工具毫无问题地部署Rails应用程序.

当您关闭shell并再次登录到生产服务器时,您将设置此环境变量并准备使用它.

就这样!我希望这mini-guide能帮助你解决这个错误.

免责声明:我不是Linux或Rails专家,所以如果您发现一些错误或任何错误,我将很乐意修复它.

Ruby-on-rails相关问答推荐

使用ActiveSupport::TimeWithZone将UTC转换为用户定义的时区

包含字母和数字组合的正则表达式

从Rails中的字符串中间提取子字符串

为 has_attached_file 等活动记录属性创建类方法

Rails 3.1 assets资源 - 奇怪的开发服务

Rails 模型.有效吗?刷新自定义错误并错误地返回 true

Rails 3 - Select 包含?

fields_for 表单构建器对象为零

Rails 在关联模型中排序

Rails:参数太少

mongoid 中 embeds_many 和 has_many 的区别

DateTime.now 还是 Time.now?

在 ID 存在时获取表的未知主键

可以在 Rails/ActiveRecord 中使用 NULL 指定唯一索引吗?

Rails:如何在表单的必填字段上禁用星号?

如何将自定义路由添加到资源路由

Rails 5:重命名表迁移

Django 还是 Ruby-On-Rails?

如何在两个字段上对 ruby​​/rails 进行排序?

如何为 Rails 迁移定义布尔字段