rails-settings: NoMethodError: undefined 方法 'merge' for []:Array



我正在尝试实现rails设置gem(https://github.com/100hz/rails-settings)使用Ruby 1.8.7 进入我的Rails 3项目

设置和检索设置非常有效,但如果我尝试获取特定用户的所有设置,就会出现错误。

因此,在"rails控制台"中,以下工作:

user = User.find(123)
user.settings.color = :red
user.settings.color

但如果我尝试获得所有设置:

user.settings.all

我得到:

NoMethodError:[]的未定义方法"merge":数组

来自/[…]/.rvm/gems/ruby-1.8.7-p334/bundler/gems/rails-settings-883114dfd933/lib/rails-settings/settings.rb:55:在`all` 中

来自(irb):5

设置中的第55行。rb:

#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

这里有什么问题?或者这是ruby 1.8.7与1.9.2的对比?

这是Ruby 1.8.7与1.9.2的

ruby 1.8.7下的Hash-select方法将返回一个Array of Arrays。

示例:

{:a => 'a', :b => 'b', :c => 'c'}.select {|k, v| v > 'a'} #=> [[:b,'b'],[:c,'c']]

而运行Ruby 1.9.2时会返回相同的东西:

{:a => 'a', :b => 'b', :c => 'c'}.select {|k, v| v > 'a'} #=> {:b => 'b',:c => 'c'}

您需要对结果进行后处理,并再次将其转换为hsah或使用类似inject的东西。

编辑:

以下是inject 的一个快速/丑陋的例子

{:a => 'a', :b => 'b', :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)

|k, v|将防止不必要的警告。

这看起来像是在试图对数组进行合并,而数组不是Ruby中Array类的方法。Hash支持Merge,看起来返回的对象类型不正确。作者肯定依赖于一个散列,在倒数第二行调用了"with_indifferent_access",它试图允许您使用字符串或符号从散列中选择项目。

我现在无法进一步研究宝石,我希望我能提供一个更有用的答案。如果这个问题以后没有得到答复,我会回来帮你的。

不确定作者为什么在选项和变量中使用双引号和单引号。他还试图手动填充散列,而不是注入。无论如何,这并不可怕,但我认为你从文件中发布的一小部分代码还有改进的空间。

相关内容

  • 没有找到相关文章

最新更新