【问题标题】:cattr_accessor outside of rails导轨外的 cattr_accessor
【发布时间】:2011-03-01 10:37:48
【问题描述】:

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

require 'rubygems'
require 'google_search'

GoogleSearch.web :q => "pink floyd"

【问题讨论】:

  • 提醒google_search gem 的作者他们遇到了这个问题。他们不应该依赖 Rails IMO 的 cattr_accessor

标签: ruby google-search


【解决方案1】:

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

【讨论】:

  • Rails 4+ 使用类似的方法 mattr_accessor,因为 cattr_accessor 在 rails 4 中已被弃用
【解决方案2】:

您可以通过包含 Ruby Facets gem 来获得此功能。在此处引用源代码:

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

您通常不需要从 gem 中获取所有代码。您可以有选择地要求您想要的。不过,gem 中有很多有用的扩展。

【讨论】:

  • 这将我带到了 ruby​​works facets 项目,该项目自这篇文章github.com/rubyworks/facets +1 开始移动,因为最终源代码很好
猜你喜欢
  • 1970-01-01
  • 2011-03-05
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多