ruby-on-rails - rails : dotenv nested hash

标签 ruby-on-rails

我已经在我的 .env 文件中声明了这个变量

WARRANTY_DETAILS_PER_MAKE = {"dacia" => {duration: 3, mileage: 100000}, "honda" => {duration: 3, mileage: 100000}, "infiniti" => {duration: 3, mileage: 100000}, "jaguar" => {duration: 3, mileage: 0}, "land-rover"=> {duration: 3, mileage: 100000}, "lexus" => {duration: 3, mileage: 100000}, "mazda" => {duration: 3, mileage: 100000}, "mitsubishi" => {duration: 3, mileage: 100000}, "nissan" => {duration: 3, mileage: 100000}, "subaru" => {duration: 3, mileage: 100000}, "suzuki" => {duration: 3, mileage: 100000}, "toyota" => {duration: 3, mileage: 100000}}

dotenv 似乎并不欣赏这一点。

我在运行服务器时得到这个。

/Users/mike/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/psych.rb:370:in `parse': (<unknown>): did not find expected ',' or '}' while parsing a flow mapping at line 25 column 30 (Psych::SyntaxError)
    from /Users/mike/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/psych.rb:370:in `parse_stream'
    from /Users/mike/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/psych.rb:318:in `parse'
    from /Users/mike/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/psych.rb:245:in `load'
    from /Users/mike/.rvm/gems/ruby-2.1.5@global/gems/railties-4.2.1/lib/rails/application.rb:391:in `secrets'
    from /Users/mike/Documents/Projects/paycar/entre-nous/config/initializers/mail.rb:4:in `<top (required)>'
    from /Users/mike/.rvm/gems/ruby-2.1.5@global/gems/activesupport-4.2.1/lib/active_support/dependencies.rb:268:in `load'
    from /Users/mike/.rvm/gems/ruby-2.1.5@global/gems/activesupport-4.2.1/lib/active_support/dependencies.rb:268:in `block in load'
    from /Users/mike/.rvm/gems/ruby-2.1.5@global/gems/activesupport-4.2.1/lib/active_support/dependencies.rb:240:in `load_dependency'
    from /Users/mike/.rvm/gems/ruby-2.1.5@global/gems/activesupport-4.2.1/lib/active_support/dependencies.rb:268:in `load'
    from /Users/mike/.rvm/gems/ruby-2.1.5@global/gems/railties-4.2.1/lib/rails/engine.rb:652:in `block in load_config_initializer'
    from /Users/mike/.rvm/gems/ruby-2.1.5@global/gems/activesupport-4.2.1/lib/active_support/notifications.rb:166:in `instrument'
    from /Users/mike/.rvm/gems/ruby-2.1.5@global/gems/railties-4.2.1/lib/rails/engine.rb:651:in `load_config_initializer'
    from /Users/mike/.rvm/gems/ruby-2.1.5@global/gems/railties-4.2.1/lib/rails/engine.rb:616:in `block (2 levels) in <class:Engine>'
    from /Users/mike/.rvm/gems/ruby-2.1.5@global/gems/railties-4.2.1/lib/rails/engine.rb:615:in `each'
    from /Users/mike/.rvm/gems/ruby-2.1.5@global/gems/railties-4.2.1/lib/rails/engine.rb:615:in `block in <class:Engine>'
    from /Users/mike/.rvm/gems/ruby-2.1.5@global/gems/railties-4.2.1/lib/rails/initializable.rb:30:in `instance_exec'
    from /Users/mike/.rvm/gems/ruby-2.1.5@global/gems/railties-4.2.1/lib/rails/initializable.rb:30:in `run'
    from /Users/mike/.rvm/gems/ruby-2.1.5@global/gems/railties-4.2.1/lib/rails/initializable.rb:55:in `block in run_initializers'
    from /Users/mike/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:226:in `block in tsort_each'
    from /Users/mike/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:348:in `block (2 levels) in each_strongly_connected_component'
    from /Users/mike/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:418:in `block (2 levels) in each_strongly_connected_component_from'
    from /Users/mike/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:427:in `each_strongly_connected_component_from'
    from /Users/mike/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:417:in `block in each_strongly_connected_component_from'
    from /Users/mike/.rvm/gems/ruby-2.1.5@global/gems/railties-4.2.1/lib/rails/initializable.rb:44:in `each'
    from /Users/mike/.rvm/gems/ruby-2.1.5@global/gems/railties-4.2.1/lib/rails/initializable.rb:44:in `tsort_each_child'
    from /Users/mike/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:411:in `call'
    from /Users/mike/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:411:in `each_strongly_connected_component_from'
    from /Users/mike/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:347:in `block in each_strongly_connected_component'
    from /Users/mike/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:345:in `each'
    from /Users/mike/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:345:in `call'
    from /Users/mike/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:345:in `each_strongly_connected_component'
    from /Users/mike/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:224:in `tsort_each'
    from /Users/mike/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:205:in `tsort_each'
    from /Users/mike/.rvm/gems/ruby-2.1.5@global/gems/railties-4.2.1/lib/rails/initializable.rb:54:in `run_initializers'
    from /Users/mike/.rvm/gems/ruby-2.1.5@global/gems/railties-4.2.1/lib/rails/application.rb:352:in `initialize!'
    from /Users/mike/Documents/Projects/paycar/entre-nous/config/environment.rb:5:in `<top (required)>'
    from /Users/mike/Documents/Projects/paycar/entre-nous/spec/rails_helper.rb:4:in `require'
    from /Users/mike/Documents/Projects/paycar/entre-nous/spec/rails_helper.rb:4:in `<top (required)>'
    from /Users/mike/Documents/Projects/paycar/entre-nous/spec/models/vehicle_spec.rb:23:in `require'
    from /Users/mike/Documents/Projects/paycar/entre-nous/spec/models/vehicle_spec.rb:23:in `<top (required)>'
    from /Users/mike/.rvm/rubies/ruby-2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.2.2/lib/rspec/core/configuration.rb:1226:in `load'
    from /Users/mike/.rvm/rubies/ruby-2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.2.2/lib/rspec/core/configuration.rb:1226:in `block in load_spec_files'
    from /Users/mike/.rvm/rubies/ruby-2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.2.2/lib/rspec/core/configuration.rb:1224:in `each'
    from /Users/mike/.rvm/rubies/ruby-2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.2.2/lib/rspec/core/configuration.rb:1224:in `load_spec_files'
    from /Users/mike/.rvm/rubies/ruby-2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.2.2/lib/rspec/core/runner.rb:97:in `setup'
    from /Users/mike/.rvm/rubies/ruby-2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.2.2/lib/rspec/core/runner.rb:85:in `run'
    from /Users/mike/.rvm/rubies/ruby-2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.2.2/lib/rspec/core/runner.rb:70:in `run'
    from /Users/mike/.rvm/rubies/ruby-2.1.5/lib/ruby/gems/2.1.0/gems/rspec-core-3.2.2/lib/rspec/core/runner.rb:38:in `invoke'
    from /Users/mike/.rvm/gems/ruby-2.1.5@global/gems/rspec-core-3.2.2/exe/rspec:4:in `<top (required)>'
    from /Users/mike/.rvm/gems/ruby-2.1.5@paycar-api/bin/rspec:23:in `load'
    from /Users/mike/.rvm/gems/ruby-2.1.5@paycar-api/bin/rspec:23:in `<main>'
    from /Users/mike/.rvm/gems/ruby-2.1.5@paycar-api/bin/ruby_executable_hooks:15:in `eval'
    from /Users/mike/.rvm/gems/ruby-2.1.5@paycar-api/bin/ruby_executable_hooks:15:in `<main>'

如果我将嵌套哈希更改为字符串以进行调试,一切都会顺利进行。

我的嵌套哈希的声明是否不正确,或者是 dotenv 的问题吗?

感谢您的帮助

最佳答案

DotEnv does not parse除了简单的带引号或不带引号的值之外的任何其他值,这与大多数 shell 处理 ENV 变量的方式一致。

LINE = /
  \A
  (?:export\s+)?    # optional export
  ([\w\.]+)         # key
  (?:\s*=\s*|:\s+?) # separator
  (                 # optional value begin
    '(?:\'|[^'])*'  #   single quoted value
    |               #   or
    "(?:\"|[^"])*"  #   double quoted value
    |               #   or
    [^#\n]+         #   unquoted value
  )?                # value end
  (?:\s*\#.*)?      # optional comment
  \z
/x

如果您确实必须使用 Ruby 哈希,您可以引用它并对其调用 eval:

# .env
FOO = '{ a: "b" }'

# call it:
foo = eval(ENV["FOO"])

或者使用 JSON:

# .env
FOO = '{ "a": "b" }'

require 'json'
begin 
  JSON.parse(ENV["FOO"])
rescue JSON::ParserError => e
  logger.error('Failed to parse ENV[FOO].')
  logger.error(e.msg)
end

但看起来您可能使用了错误的工具来完成这项工作,YML 配置文件可能更合适。

关于ruby-on-rails - rails : dotenv nested hash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39794690/

相关文章:

ruby-on-rails - 如何在 ruby​​ 中使用 utf8 的正则表达式

ruby-on-rails - 无方法错误 : undefined method `last_comment' after upgrading to rake 11

ruby-on-rails - FactoryGirl has_many与验证关联

ruby-on-rails - rails : 'has_many :stickies' the "Rails Way"

mysql - 如何使用 Controller 中给定的凭据检查数据库连接

ruby-on-rails - Rails select_tag "required"选项在 Safari 中不起作用

ruby-on-rails - 如何在没有 Rake 的情况下运行完整的 MiniTest 套件?

javascript - JQuery-File-Upload 客户端图像使用 coffeescript 调整大小

ruby-on-rails - Rails 4 app redirect_to 在发布请求后不重新加载网页

ruby-on-rails - Spree API 和 New Relic 监控