ruby on rails constantize方法

时间:2018-03-08 23:36:05

标签: ruby-on-rails ruby model

我是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并且没有看到关于这种用法的任何详细解释,希望这里的一些人可以对此有所了解。提前谢谢

2 个答案:

答案 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源代码。