关于以下代码:
Rails.application.routes.draw do
get 'welcome/index'
resources :articles do
resources :comments
end
root 'welcome#index'
end
据我了解,Rails.application.routes.draw
是一种接受块的方法,do
end
之间定义的是哪个块?
答案 0 :(得分:6)
您可以通过两种方式在Ruby中编写块:
在简短版本中,代码被{
和}
包围。此版本主要用于一行代码。
names.each { |name| puts name }
在长版本中,代码被do
和end
包围。这是多行版本。您发布的代码示例是多行块的一个很好的示例。
Rails.application.routes.draw do
get 'welcome/index'
resources :articles do
resources :comments
end
root 'welcome#index'
end
答案 1 :(得分:1)
是的,resources
是一个需要阻止的函数。
在内部,块在父资源的范围内执行,其代码如下所示(简化)
def resources(resource, &block)
...
begin
# make resource the new parent before calling the block
@scope.push(resource)
# call the block
yield
ensure
# restore the previous parent
@scope.pop
end
...
end
像这样,资源的嵌套和代码在routes.rb
文件中的嵌套是相互镜像的。
请在此处查看完整代码https://github.com/rails/rails/tree.master/actionpack/lib/action_dispatch/routing/mapper.rb
答案 2 :(得分:0)
ressources关键字代表crud RESTFULL函数(创建,读取,更新,销毁)所以当我们放
时资源文章==>为文章模型创建crud路由 对于每篇文章我们都有评论,所以如果我们想为文章创建一个新的评论,我们必须精确的文章资源。
例如为包含1 Id的文章创建新评论
blablabla.com/articles/1/comment/new
如果我们想破坏带有Id 1的文章ID 144的评论
blablabla.com/articles/1/comment/144 on DELETE http request
答案 3 :(得分:0)
如果您打开并在/.rvm/gems/ruby-2.4.7@itildesk/gems/actionpack-4.2.11.1/lib/action_dispatch/routing/route_set.rb:408
处看到draw方法的实现,将会更加清楚。
它接受代码块。即 do 和 end 之间的任何内容,并执行 instance_exec 将您提到的所有资源或路径添加到其内部路由的变量中。
每当遇到do-end块时,只要记住该代码块是 作为参数传递,它将执行 某个地方。