2

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

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

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

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

然后我尝试了这个:

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

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

4

1 回答 1

4

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

如果您想要更多阅读材料,请查看关联基础指南(例如,关于has_many关联的部分),其中列出了所有添加的方法以及它们所采用的参数。

至于它究竟是如何工作的,这个.themes对象实际上是一个AssociationProxy这里的源),Array它的目标是一个,而不是一个Array本身。.class返回'Array'是因为代理本身不响应该.class方法,而是Array通过method_missing. 这个答案给出了更详细的解释。

于 2013-04-05T02:23:37.760 回答