无法修改冻结的数组(TypeError)- config/application.rb:42:in `<<':
无法修改冻结的数组(TypeError)- config/application.rb:42:in `<<':
我有一个Rails 3应用程序,并且正在进行测试。我执行以下命令rspec spec/controllers/,并得到以下错误:
/config/application.rb:42:in `<<':无法修改冻结的数组(TypeError) from c:/Users/#####/documents/#####/config/application.rb:42
它指向我的config/application.rb文件,下面是我提供的内容。
require File.expand_path('../boot', __FILE__) require 'rails/all' # 如果有Gemfile,请在此处加载列出的gem,包括任何限制为:test、:development或:production的gem。 Bundler.require(:default, Rails.env) if defined?(Bundler) module PadOnRails class Application < Rails::Application # config/environments/*中的设置优先于此处指定的设置。 # 应用程序配置应放入config/initializers中的文件 # -- 该目录中的所有.rb文件都会自动加载。 # 自定义class和module的目录,您希望自动加载。 # config.autoload_paths += %W(#{config.root}/extras) # 只按给定的顺序加载这里命名的插件(默认为按字母顺序)。 # :all可用作所有未显式命名插件的占位符。 # config.plugins = [ :exception_notification, :ssl_requirement, :all ] # 激活应始终运行的观察者。 # config.active_record.observers = :cacher, :garbage_collector, :forum_observer # 将Time.zone默认设置为指定的区域,并使Active Record自动转换为此区域。 # 运行“rake -D time”以获取查找时区名称的任务列表。默认为UTC。 # config.time_zone = 'Central Time (US & Canada)' # 默认区域设置为:en,并且自动加载来自config/locales/*.rb,yml的所有翻译。 # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] # config.i18n.default_locale = :de # JavaScript文件您希望作为:defaults(application.js始终包含)。 # config.action_view.javascript_expansions[:defaults] = %w(jquery rails) # 配置用于Ruby 1.9模板的默认编码。 config.encoding = "utf-8" # 配置从日志文件中过滤的敏感参数。 config.filter_parameters += [:password] config.autoload_paths << "#{config.root}/lib" end end
是否还有其他人遇到过这种确切的问题?如果是这样,您是如何解决的?因为我已经删除了我的项目并重新进行了git clone,但仍然遇到相同的错误。
问题的原因是尝试修改一个被冻结的数组。在config/application.rb文件的第42行,使用了`<<`操作符来向一个被冻结的数组中添加元素,这是不允许的,因此导致了TypeError错误的出现。
解决这个问题的方法是尝试使用评论中提到的方法:
config.autoload_paths += %W{#{config.root}/lib}
这个方法不会修改初始的数组,而是将给定的数组添加到config.autoload_paths中,并将它保存到一个新的数组中。
通过以上整理,我们可以得出以下结论: TypeError错误的出现是因为尝试修改一个被冻结的数组,解决这个问题的方法是使用+=操作符来向一个新的数组中添加元素。