【问题标题】:heroku "cannot convert nil into string"heroku“无法将 nil 转换为字符串”
【发布时间】:2014-07-29 04:51:58
【问题描述】:

我在 rails4 上使用 ruby​​,并尝试部署到 heroku。但是,当我尝试运行 “heroku run rake db:migrate”,我收到以下错误。

Running `rake db:migrate` attached to terminal... up, run.8591
rake aborted!
TypeError: can't convert nil into String 
/app/config/initializers/devise.rb:13:in `+'
/app/config/initializers/devise.rb:13:in `block in <top (required)>'
/app/vendor/bundle/ruby/1.9.1/bundler/gems/devise-66db52ce31b5/lib/devise.rb:292:in   `setup'
/app/config/initializers/devise.rb:3:in `<top (required)>'
/app/vendor/bundle/ruby/1.9.1/gems/activesupport- 4.1.4/lib/active_support/dependencies.rb:241:in `load'
/app/vendor/bundle/ruby/1.9.1/gems/activesupport-4.1.4/lib/active_support/dependencies.rb:241:in `block in load'
/app/vendor/bundle/ruby/1.9.1/gems/activesupport-4.1.4/lib/active_support/dependencies.rb:232:in `load_dependency'
 /app/vendor/bundle/ruby/1.9.1/gems/activesupport-4.1.4/lib/active_support/dependencies.rb:241:in `load'
 /app/vendor/bundle/ruby/1.9.1/gems/railties-4.1.4/lib/rails/engine.rb:648:in `block in load_config_initializer'
 /app/vendor/bundle/ruby/1.9.1/gems/activesupport-4.1.4/lib/active_support/notifications.rb:161:in `instrument'
 /app/vendor/bundle/ruby/1.9.1/gems/railties-4.1.4/lib/rails/engine.rb:647:in `load_config_initializer'
 /app/vendor/bundle/ruby/1.9.1/gems/railties-4.1.4/lib/rails/engine.rb:612:in `block (2 levels) in <class:Engine>'
/app/vendor/bundle/ruby/1.9.1/gems/railties-4.1.4/lib/rails/engine.rb:611:in `each'
/app/vendor/bundle/ruby/1.9.1/gems/railties-4.1.4/lib/rails/engine.rb:611:in `block in <class:Engine>'
/app/vendor/bundle/ruby/1.9.1/gems/railties-4.1.4/lib/rails/initializable.rb:30:in `instance_exec'
/app/vendor/bundle/ruby/1.9.1/gems/railties-4.1.4/lib/rails/initializable.rb:30:in `run'
/app/vendor/bundle/ruby/1.9.1/gems/railties-4.1.4/lib/rails/initializable.rb:55:in `block in run_initializers'
/app/vendor/bundle/ruby/1.9.1/gems/railties-4.1.4/lib/rails/initializable.rb:44:in `each'
/app/vendor/bundle/ruby/1.9.1/gems/railties-4.1.4/lib/rails/initializable.rb:44:in `tsort_each_child'
/app/vendor/bundle/ruby/1.9.1/gems/railties-4.1.4/lib/rails/initializable.rb:54:in `run_initializers'
/app/vendor/bundle/ruby/1.9.1/gems/railties-4.1.4/lib/rails/application.rb:300:in `initialize!'
/app/config/environment.rb:5:in `<top (required)>'
/app/vendor/bundle/ruby/1.9.1/gems/activesupport-4.1.4/lib/active_support/dependencies.rb:247:in `require'
/app/vendor/bundle/ruby/1.9.1/gems/activesupport-4.1.4/lib/active_support/dependencies.rb:247:in `block in require'
/app/vendor/bundle/ruby/1.9.1/gems/activesupport-4.1.4/lib/active_support/dependencies.rb:232:in `load_dependency'
/app/vendor/bundle/ruby/1.9.1/gems/activesupport-4.1.4/lib/active_support/dependencies.rb:247:in `require'
/app/vendor/bundle/ruby/1.9.1/gems/railties-4.1.4/lib/rails/application.rb:276:in `require_environment!'
/app/vendor/bundle/ruby/1.9.1/gems/railties-4.1.4/lib/rails/application.rb:379:in `block in run_tasks_blocks'
  Tasks: TOP => db:migrate => environment
(See full trace by running task with --trace)

这是我的 Gemfile

source 'https://rubygems.org'
ruby '1.9.3'
gem 'rails', '4.1.4'
gem 'sass-rails', '~> 4.0.3'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.0.0'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0',          group: :doc
gem 'spring',        group: :development
gem 'bootstrap-sass'
gem 'devise', github: 'plataformatec/devise'
gem 'pundit'


gem 'mail_form'
gem 'simple_form'

group :development do
  gem 'better_errors'
  gem 'binding_of_caller', :platforms=>[:mri_19]
  gem 'quiet_assets'
  gem 'rails_layout'
end
group :development, :test do
   gem 'factory_girl_rails'
   gem 'rspec-rails'
end
group :test do
  gem 'capybara'
  gem 'database_cleaner'
  gem 'faker'
  gem 'launchy'
  gem 'selenium-webdriver'
end
group :production do
  gem 'rails_12factor'
end

gem 'pg'
gem 'validates_formatting_of'
gem 'acts_as_votable', '~> 0.10.0'

gem 'therubyracer',  platforms: :ruby
gem "less-rails"
gem 'twitter-bootstrap-rails'

gem 'mini_magick'
gem 'ransack'
gem 'carrierwave'
gem 'jquery-fileupload-rails'


gem 'bundler'
gem 'activeadmin', github: 'gregbell/active_admin'


gem 'haml'                # or gem 'slim'
gem 'awesome_nested_set'  # or same gem

这是database.yml

 default: &default
    adapter: postgresql
    encoding: unicode
    pool: 5
    timeout: 5000

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

production:
  <<: *default
  database: myapp_production

这是应用程序.rb

require File.expand_path('../boot', __FILE__)

require 'rails/all'
require 'devise'
# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module Korffice
  class Application < Rails::Application

   config.generators do |g|
      g.test_framework :rspec,
        fixtures: true,
        view_specs: false,
        helper_specs: false,
        routing_specs: false,
        controller_specs: false,
        request_specs: false
     g.fixture_replacement :factory_girl, dir: "spec/factories"
    end

    config.assets.initialize_on_precompile = false
    config.serve_static_assets = true

  end
end

这是secrets.yml

development:
  admin_name: First User
  admin_email: user@example.com
  admin_password: changeme
  email_provider_username: <%= ENV["GMAIL_USERNAME"] %>
  email_provider_password: <%= ENV["GMAIL_PASSWORD"] %>
  domain_name: example.com
  secret_key_base:   98b154040ed274afa3f122e5b3a4f18cac77ac62465b709d94c61e93300bec895ac3b3aa127ad2a8ac5e1a18c894c01c5c61f1f71f0e391dfad6d2b43f781816

test:
  domain_name: example.com 
  secret_key_base: 1a32266f762d172de9f3f9eb52750ee7f8ec8196e77cc940c6eb754ce8ffa4fc93d82682daaad83beba9b2bf25303455a3c149be4092445637de875c6b375489

# Do not keep production secrets in the repository,
# instead read values from the environment.
production:
  admin_name: <%= ENV["ADMIN_NAME"] %>
  admin_email: <%= ENV["ADMIN_EMAIL"] %>
  admin_password: <%= ENV["ADMIN_PASSWORD"] %>
  email_provider_username: <%= ENV["GMAIL_USERNAME"] %>
  email_provider_password: <%= ENV["GMAIL_PASSWORD"] %> 
  domain_name: <%= ENV["DOMAIN_NAME"] %>
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

这是devise.rb

 Devise.setup do |config|
      config.mailer_sender = 'no-reply@' + Rails.application.secrets.domain_name
      require 'devise/orm/active_record'
     config.case_insensitive_keys = [ :email ]
     config.strip_whitespace_keys = [ :email ]
     config.skip_session_storage = [:http_auth]
     config.stretches = Rails.env.test? ? 1 : 10
     config.reconfirmable = true
     config.password_length = 8..128
     config.reset_password_within = 6.hours
     config.sign_out_via = :delete
  end

请帮忙:(

【问题讨论】:

  • 我的猜测是 Rails.application.secrets.domain_name 为零...我会看看你应该如何设置它。

标签: ruby-on-rails heroku devise null


【解决方案1】:

当您部署到 heroku 时,它需要 domain_name,对于 开发,您已将其设置为字符串:example.com

生产中,它希望在变量中设置域名:&lt;%= ENV["DOMAIN_NAME"] %&gt;,heroku 上的域名没有像在本地机器上那样设置。

要在heroku中使用环境变量,你可以使用figaro gem

【讨论】:

  • 我已经完成了 gem "figaro" --> "rails generate figaro:install"->"rake figaro:heroku" 跟在 "github.com/laserlemon/figaro/tree/0-stable" 之后。但即使我这样做了,我仍然得到同样的错误:(
  • 您可以尝试将&lt;%= ENV["SECRET_KEY_BASE"] %&gt; 变量更改为纯字符串,例如mydomain.com 并部署到heroku,如果您没有收到现在的错误,则表示您没有设置figaro适当地。还要寻找 heorku figrao 插件,如果我没记错的话,你需要为此添加一个插件。
  • Heroku 什么时候需要domain_name
  • @RichPeck,你在问我吗?
  • 任何知道答案的人:D
【解决方案2】:

为了给你另一个视角,我看了这个答案:Deploying Rails App to Heroku Keeps Crashing


设计

我不知道Heroku 是否需要您设置domain_name(我已经有一段时间没有在那里部署了),但无论如何,我想说Devise 的问题更多:

app/config/initializers/devise.rb:13:in `+'

当您为 Devise 分配 email 时,您似乎遇到了错误,您在此处执行此操作:

#config/initializers/devise.rb
config.mailer_sender = 'no-reply@' + Rails.application.secrets.domain_name

您遇到的问题是您在开发环境的secrets 中设置了domain_name;并在生产中为domain_name 使用了ENV 变量。

--

ENV 变量

要解决此问题,您需要确保在 Heroku 上设置了 ENV 变量。要做到这一点,你需要感谢what an ENV variable is(与Figaro无关)

ENV(环境)变量位于操作系统上并允许 访问(通常是秘密)数据池的应用程序,这些数据可以是 在整个应用程序中使用。 ENV 变量通常用于 存储敏感数据(如API键),主要是为了解耦 来自应用程序本身的数据(使系统更安全)

您的DOMAIN_NAME 设置似乎没有环境变量。为此,您最好使用 Heroku 的 CLI(命令行界面)到set it

$ heroku config:set DOMAIN_NAME=your_domain.com

【讨论】:

  • Heroku 本身不需要任何域名,但根据他的设计代码,他需要这个变量,所以 Heroku 的问题只是应用程序在启动时由于缺少变量而崩溃。您的答案只是我的扩展版本,它与 Figaro 有关系,因为使用 Figaro 您可以在 heroku 上设置变量。我在 heroku 上做了很多部署,我确信我是对的。
  • 是的,你是对的——我的答案是你的延伸;因此,为什么我在一开始就提到了这一点(并不是要贬低,最好为 OP 获得两种意见)。关于 Figaro - 这只会设置 ENV 变量。虽然从技术上讲,这 与问题有关,但它不是实际的修复——实际的修复是设置 ENV var。当然,您可以通过 Figaro 做到这一点,但无论您是否这样做,答案都不取决于是否使用 Figaro
  • 我之所以知道,是因为我自己花了好几天时间来解决 Heroku 上与 ENV vars 相关的问题 :)
  • 但是如果他使用heroku config:set DOMAIN_NAME=your_domain.com,他每次在heroku上重新启动时都必须使用这个命令,因为当你这样做时所有变量都消失了。特别是当您有很多钥匙时,这似乎是一件非常烦人的事情。至少这是我们在使用 figaro 之前所做的,每次我们重启 heroku 时都必须按键。
  • ENV 变量存储在操作系统级别(使用 linux 时通常在 .bashrc/etc/environment - 这是 Heroku 使用的);你可以在不重置 Heroku 的情况下随意重启 Heroku。我认为您是在暗示 SHELL variables 在每个 shell 会话后被删除
【解决方案3】:

我遇到了同样的问题。我在 secret.yml 中设置了 DOMAIN_NAME 等,并且这个文件被 git 忽略了,因为我想将凭据保密。所以 Heroku 找不到这些配置值。

使用 figaro gem 似乎是解决此问题的好方法。但我不想添加另一个 gem 并创建一个新的 yml 文件。

我所做的是直接设置 Heroku 环境变量,它起作用了:

$ heroku config:add GMAIL_USERNAME='myname@gmail.com' GMAIL_PASSWORD='mypassword'
$ heroku config:add DOMAIN_NAME='example.com'

【讨论】:

    猜你喜欢
    • 2012-02-09
    • 2013-04-17
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多