Ruby on rails 嵌套资源是如何工作的?
作为官方网站,我定义了两个模型Ruby on rails 嵌套资源是如何工作的?,ruby-on-rails,resources,Ruby On Rails,Resources,作为官方网站,我定义了两个模型Post和Comment注释嵌套在Post中 resources :posts do resources :comments end 因此,我可以使用@post.comments访问一篇文章中的所有评论。在控制台中: $ post = Post.new() $ post.comments.class > Array 但是: 为什么??数组具有方法构建?Rails做得怎么样?我如何知道其他隐藏的post.comments?在ruby中,您可以在任何对象中
Post
和Comment
<代码>注释嵌套在Post
中
resources :posts do
resources :comments
end
因此,我可以使用@post.comments
访问一篇文章中的所有评论。在控制台中:
$ post = Post.new()
$ post.comments.class
> Array
但是:
为什么??数组具有方法
构建
?Rails做得怎么样?我如何知道其他隐藏的post.comments
?在ruby中,您可以在任何对象中添加或更改任何方法。您甚至可以向字符串实例添加新方法,例如:
x = "xyzzy"
x.name # => NoMethodError: undefined method `name' for "xyzzy":String
x.instance_eval do
class << self
define_method(:name) {"I got a name"}
end
end
x.class # => String
x.name # => "I got a name"
y = "other"
y.class # => String
y.name # => NoMethodError: undefined method `name' for "other":String
x=“xyzy”
x、 name#=>NoMethodError:xyzy的未定义方法'name':String
x、 实例(eval do)
类字符串
x、 名字#=>“我有名字”
y=“其他”
y、 类#=>字符串
y、 name#=>NoMethodError:other的未定义方法'name':字符串
该build
方法可能已“添加”到由has\u many
宏创建的comments
访问器返回的数组实例中。(正如加里斯指出的那样,Rails将事情复杂化了一点,而这种关联并不是这样工作的。然而,扩展对象与透明代理相比可能是一种更为‘干净’的方式。
至于问题的第二部分,您可以通过访问其methods
函数了解给定对象的方法。它返回为此对象定义的所有(公共)方法的名称。(如果需要专用方法,请参阅private\u方法
函数。)
在我的示例中,x.methods
还将包括新定义的“name”方法,但y.methods
不会
ruby中还有其他函数,您可以使用这些函数检查对象。你可以在里面找到它们。在不同版本的ruby中,API可能会有一些(通常是轻微的)变化。请参阅所使用版本的文档
如果您想检查某个方法的代码,那么这可能是一个小问题,因为函数的“可执行代码”可以通过多种方式创建:它可以是另一个函数的副本(别名),也可以使用eval
函数动态创建,等等
知道方法的名称可能会“grep”现有的源代码,并且可能尚未动态创建所需的方法
我看到这个项目还活着。如果你真的想知道一个没有源代码的函数的代码,也许你会发现它很有用。首先,你的
资源调用在你的routes.rb
文件中,它只处理Rails的URL解析端。这与您的模型之间的关联无关,这些关联是使用相关模型文件中的有许多和属于调用来设置的。暂时忽略routes文件,因为它与问题的主要部分无关
关于关联,您会发现post.comments
并没有返回一个Array
,它实际上返回了一个ActiveRecord::Relation
对象。一个关系
对象就像一个数组——事实上,对它调用的任何非关系特定的方法(比如构建
)实际上都会传递给关系
内容的数组
表示。因此,当您调用post.comments.length
时,comments
关联对象正在其内部数组上调用.length
这样做的后果之一是调用post.comments.class
实际上也会将.class
调用传递给数组
那么,这个关系对象实际上能做什么呢?由于关联是通过调用has\u many
建立的,因此您可以在has\u many
中找到。类似地,对于属于关联x的方法
只列出所有方法。但是我想要它们的意思(即Rdoc)。Rdoc(意思:注释)与方法的“主体”没有联系。知道方法的名称后,您可以尝试浏览(grep)源代码。但方法可以作为别名添加到对象中,通过调用eval
或通过许多其他方式定义。有一个名为“parsetree”的项目,旨在“反编译”ruby代码,但我没有使用它。
x = "xyzzy"
x.name # => NoMethodError: undefined method `name' for "xyzzy":String
x.instance_eval do
class << self
define_method(:name) {"I got a name"}
end
end
x.class # => String
x.name # => "I got a name"
y = "other"
y.class # => String
y.name # => NoMethodError: undefined method `name' for "other":String