cattr_accessor在rails之外

时间:2010-06-09 00:02:07

标签: ruby google-search

我正在尝试使用google_search ruby​​库(代码如下),但它抱怨'cattr_accessor是一种未定义的方法' - 任何想法为什么会这样或我如何解决它?

require 'rubygems'
require 'google_search'

GoogleSearch.web :q => "pink floyd"

2 个答案:

答案 0 :(得分:10)

cattr_accessor似乎是Rails扩展程序that acts like attr_accessor, but is accessible on both the class and its instances

如果您要复制cattr_accessor方法的来源,请查看this documentation

# File vendor/rails/activesupport/lib/active_support/core_ext/class/attribute_accessors.rb, line 46
def cattr_accessor(*syms)
  cattr_reader(*syms)
  cattr_writer(*syms)
end

# File vendor/rails/activesupport/lib/active_support/core_ext/class/attribute_accessors.rb, line 4
def cattr_reader(*syms)
  syms.flatten.each do |sym|
    next if sym.is_a?(Hash)
    class_eval("unless defined? @@\#{sym}\n@@\#{sym} = nil\nend\n\ndef self.\#{sym}\n@@\#{sym}\nend\n\ndef \#{sym}\n@@\#{sym}\nend\n", __FILE__, __LINE__)
  end
end

# File vendor/rails/activesupport/lib/active_support/core_ext/class/attribute_accessors.rb, line 24
def cattr_writer(*syms)
  options = syms.extract_options!
  syms.flatten.each do |sym|
    class_eval("unless defined? @@\#{sym}\n@@\#{sym} = nil\nend\n\ndef self.\#{sym}=(obj)\n@@\#{sym} = obj\nend\n\n\#{\"\ndef \#{sym}=(obj)\n@@\#{sym} = obj\nend\n\" unless options[:instance_writer] == false }\n", __FILE__, __LINE__)
  end
end

答案 1 :(得分:3)

您可以通过包含Ruby Facets gem来获得此功能。在这里参考来源:

https://github.com/rubyworks/facets/blob/master/lib/core/facets/cattr.rb

您通常不需要宝石中的所有代码。您可以有选择地要求您想要的东西。宝石中有很多有用的扩展。