rails-settings:NoMethodError:[]:Array的未定义方法\'merge\'

问题描述

|| 我正在尝试使用Ruby 1.8.7将rails-settings gem(https://github.com/100hz/rails-settings)实现到我的Rails 3项目中 设置和检索设置可以完美地工作,但是如果尝试获取特定用户的所有设置,则会收到错误消息。 因此,在“ rails控制台”中,以下工作:
user = User.find(123)
user.settings.color = :red
user.settings.color
但是,如果我尝试获取所有设置:
user.settings.all
我得到:   NoMethodError:[]:Array的未定义方法“ merge \”      来自/[...]/.rvm/gems/ruby-1.8.7-p334/bundler/gems/rails-settings-883114dfd933/lib/rails-settings/settings.rb:55:in'all \'      来自(irb):5 settings.rb中的第55行:
#retrieve all settings as a hash (optionally starting with a given namespace)
def self.all(starting_with=nil)
  options = starting_with ? { :conditions => \"var LIKE \'#{starting_with}%\'\"} : {}
  vars = thing_scoped.find(:all,{:select => \'var,value\'}.merge(options))

  result = {}
  vars.each do |record|
    result[record.var] = record.value
  end
  # line 55 is below this one...
  @@defaults.select{ |k| k =~ /^#{starting_with}/ }.merge(result).with_indifferent_access
end
这里有什么问题?还是这是红宝石1.8.7对1.9.2?     

解决方法

        那是Ruby 1.8.7与1.9.2的对比 ruby 1.8.7下的Hash select方法将返回一个数组数组。 例:
{:a => \'a\',:b => \'b\',:c => \'c\'}.select {|k,v| v > \'a\'} #=> [[:b,\'b\'],[:c,\'c\']]
运行Ruby 1.9.2的同一件事将返回:
{:a => \'a\',v| v > \'a\'} #=> {:b => \'b\',:c => \'c\'}
您将需要对结果进行后期处理,然后再次将其转换为hsah或使用
inject
之类的东西。 编辑: 这是
inject
的一个简短示例
{:a => \'a\',:c => \'c\'}.inject({}) {|r,e| e[1] > \'a\' ? r.merge({e[0] => e[1]}) : r }
从语义上讲:
collection.inject(container) { |container,element| select_condition ? container + element : container }
编辑2 :(基于@CaleyWoods帖子)
Hash[*@@defaults.select{ |k,v| k =~ /^#{starting_with}/ }.flatten].merge(result)
ѭ10可以防止不必要的警告。     ,        看起来它正在尝试对不是Ruby中Array类的方法的Array进行合并。哈希支持合并,看起来您返回的对象不是正确的类型。作者绝对依赖哈希,在最后一行的最后一行调用“ with_indifferent_access \”,它试图允许您从哈希中选择带有字符串或符号的项目。 我现在无法进一步检查该宝石,希望我能提供一个更有用的答案。如果以后没有回答,我会回来帮您。 不知道为什么作者在选项和变量中使用双引号和单引号。他还尝试手动填充哈希,而不是使用inject。无论如何,这并不可怕,但是我认为您从文件中发布的少量代码还有改进的余地。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...