Sinatra如何允许其语法?

时间:2015-05-12 23:48:34

标签: ruby sinatra

Sinatra的一个例子是:

require 'sinatra/base'

class MyApp < Sinatra::Base
  set :sessions, true
  set :foo, 'bar'

  get '/' do
    'Hello world!'
  end
end

Sinatra如何允许“get'/'do”语法?它似乎不是一种方法,我不知道任何其他语法允许这样做。

2 个答案:

答案 0 :(得分:2)

get '/'指定应用程序的GET端点。如果你要启动服务器并转到localhost:port /,那么你会看到“Hello world!&#39;在页面上。

def get(path, opts = {}, &block)
  conditions = @conditions.dup
  route('GET', path, opts, &block)

  @conditions = conditions
  route('HEAD', path, opts, &block)
end

这是Sinatra的lib中的get方法。 get方法将路径作为参数,并将您路由到该路径。您也可以传入选项(opts),但在您的示例中没有完成。最后一个参数是一个块。这是do和end之间的部分。

答案 1 :(得分:2)

这在Ruby中称为"Internal Domain-Specific Language"。你调用的get实际上是一个由Sinatra定义的方法,它采用一个块(这是你对get的实现)。

当你发现自己调用奇怪的方法,但仍然能够执行看似普通的Ruby代码时,你可能会使用内部DSL。例子包括Bundler的Gemfiles,Rake的Rakefiles,RSpec规范......