Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 嵌套资源是如何工作的?_Ruby On Rails_Resources - Fatal编程技术网

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