【问题标题】:Rails: How To Track Down A Method Called On An Array That Has No Such Method?Rails:如何跟踪在没有此类方法的数组上调用的方法?
【发布时间】:2013-03-27 07:44:15
【问题描述】:

我正在尝试找出 Rails 应用程序中的某些内容。我们有一个具有主题(主题类)的类站点,当站点上传主题时,它可以为特定站点安装它。所以我正在跟踪代码,我看到它调用了这样的方法'build':

@theme = @current_site.themes.build(params[:theme])

themes 方法只返回与该站点关联的主题对象数组。所以在rails控制台中我尝试了这个(包括结果):

>> site.themes.method(:build).__file__
NameError: undefined method `build' for class `Array'

然后我尝试了这个:

>> site.themes.respond_to? :build
=> true

所以我的问题是双重的,我怎样才能找到“构建”的定义位置,以便我可以理解它是如何工作的?有人可以向我解释一下“构建”这样的方法是如何工作的吗?在没有此类方法的 Array 对象的末尾调用?谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby methods call


    【解决方案1】:

    鉴于您的 Site 模型 has_many :themes,这是关联自动添加到其中的关联方法之一。

    如果您想要更多阅读材料,请查看Association Basics Guide(例如,has_many associations 部分),它列出了所有添加的方法以及它们所采用的参数。

    至于具体是如何工作的,.themes 对象实际上是一个AssociationProxy (source here),其目标是Array,而不是Array 本身。 .class 返回'Array',因为代理本身不响应.class 方法,而是通过method_missing 将其转发到其目标(Array)。 This answer给出了更详细的解释。

    【讨论】:

      猜你喜欢
      • 2011-03-22
      • 2011-10-16
      • 2021-08-07
      • 2015-06-05
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      相关资源
      最近更新 更多