理解routes.rb中的“do,end”语法

时间:2016-12-23 20:39:42

标签: ruby-on-rails ruby

关于以下代码:

Rails.application.routes.draw do
  get 'welcome/index'

  resources :articles do
    resources :comments
  end

  root 'welcome#index'
end

据我了解,Rails.application.routes.draw是一种接受块的方法,do end之间定义的是哪个块?

4 个答案:

答案 0 :(得分:6)

您可以通过两种方式在Ruby中编写块:

在简短版本中,代码被{}包围。此版本主要用于一行代码。

names.each { |name| puts name }

在长版本中,代码被doend包围。这是多行版本。您发布的代码示例是多行块的一个很好的示例。

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块时,只要记住该代码块是 作为参数传递,它将执行 某个地方。