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

时间:2011-05-31 14:28:53

标签: ruby ruby-on-rails-3

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

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

因此,在'rails console'中,以下工作原理:

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的东西?

2 个答案:

答案 0 :(得分:3)

这是Ruby 1.8.7对1.9.2的事情

ruby​​ 1.8.7下的哈希选择方法将返回一个数组数组。

示例:

{: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|可以防止不必要的警告。

答案 1 :(得分:0)

这看起来好像是在尝试在一个Array上进行合并,这个方法不是Ruby中的Array类。 Hash支持Merge,看起来返回的对象不是正确的类型。作者绝对依赖于哈希,在最后一行的'with_indifferent_access'被调用,它试图允许你用字符串或符号从哈希中选择项目。

我现在无法进一步检查宝石,我希望能提供更有帮助的答案。如果以后没有回答,我会回来帮助你。

不确定作者为何在选项和变量中使用双引号和单引号。他也试图用手工填充哈希,而不是注入。它无论如何都不可怕,但我认为你从文件中发布的一小段代码还有改进的余地。