我是ruby on rails的新手,看一些代码,我在模型中遇到了以下内容:
class Search < ActiveRecord::Base
#search different system user by dn
def self.gets(sys, dn)
sys.constantize.search(dn)
end
end
我可以看到目的是将不同的模型名称作为sys传递,并在这些特定模型中按dn搜索。但是,我已经在网上搜索了在ruby中使用constantize并且没有看到关于这种用法的任何详细解释,希望这里的一些人可以对此有所了解。提前谢谢
答案 0 :(得分:1)
Rails documentation(因为constantize是一个Rails方法)说:
尝试使用参数中指定的名称查找常量 字符串。
例如,如果您的应用程序中有一个名为Foo的模型,那么您可以将constantize方法应用于包含确切单词Foo的字符串,并且它将为您提供具有此模型的新对象。请注意,这必须大写,因为Rails可以与您的模型一起使用,如果您执行了错误的引用,那么您将收到NameError
错误:
NameError: wrong constant name foo
它是如何做到的?,如果你去方法定义,或者你玩方法得到一个错误,你会看到源点指向activesupport-5.1.5/lib/active_support/inflector/methods.rb:269:in 'const_get'
,这是方法定义和错误来源。
在方法处理内部的情况下,取决于作为参数接收的内容,你会看到Object.const_get(string)
这是Ruby(纯)处理“constantiz-ation”的方式,这将是相同的做
Object.const_get('Foo') # Foo(...)
Object.const_get('foo') # NameError: wrong constant name foo
如果考虑实施这个方便的方法,你可以看看几年前Gavin Miller的post。
答案 1 :(得分:0)
当我在编辑器(RubyMine)中键入'foo'.constantize
并点击 Ctrl + B 时,它会转到源.../activesupport-4.2.8/lib/active_support/core_ext/string/inflections.rb
,评论:
# +constantize+ tries to find a declared constant with the name specified
# in the string. It raises a NameError when the name is not in CamelCase
# or is not initialized. See ActiveSupport::Inflector.constantize
#
# 'Module'.constantize # => Module
# 'Class'.constantize # => Class
# 'blargle'.constantize # => NameError: wrong constant name blargle
def constantize
ActiveSupport::Inflector.constantize(self)
end
最终可能会调用Object.get_const()
。我建议您通过代码浏览获得更好的编辑器,并开始学习Rails源代码。