2

我正在寻找方法来干燥我的 Sinatra 应用程序并遇到了一些范围界定问题——特别是,我的处理程序中没有帮助程序和 Sinatra 函数。有人可以告诉我是否有办法修复此代码,更重要的是,发生了什么?

谢谢你。

require 'sinatra'
require 'pp'

helpers do
  def h(txt)
    "<h1>#{txt}</h1>"
  end
end

before do
  puts request.path
end


def r(url, get_handler, post_handler = nil)
  get(url){ get_handler.call } if get_handler
  post(url){ post_handler.call } if post_handler
end


routes_composite_hash = {
    '/' => lambda{ h('index page'); pp params }, #can't access h nor params!!!
    '/login' => [lambda{'login page'}, lambda{'login processing'}],
    '/postonly' => [nil, lambda{'postonly processing'}],
}

routes_composite_hash.each_pair do |k,v|
  r(k, *v)
end
4

2 回答 2

2

有趣的!

做这个:

def r(url, get_handler, post_handler = nil) 
  get(url, &get_handler) if get_handler
  post(url, &post_handler) if post_handler
end


routes_composite_hash = {
    '/' => lambda{ h('index page'); pp params },
    '/login' => [lambda{'login page'}, lambda{'login processing'}],
    '/postonly' => [nil, lambda{'postonly processing'}],
}

routes_composite_hash.each_pair do |k,v|
  r(k, *v)
end

正如Kashyap解释的那样,您在main上下文中调用了 get 和 post 处理程序。这只是将发送的 lambda 转换为一个块并将其传递给所需的方法。

于 2013-08-09T20:31:34.703 回答
1

您在块中定义的方法helpers do .. end仅在路由、过滤器和视图上下文中可用,因此,由于您没有在其中任何一个中使用它们,因此它将不起作用。Lambdas 保留执行上下文,这意味着在 hash{'/' => lambda { h }..}中,上下文mainget方法内部,上下文发生变化,并且助手仅在此上下文中可用。

但是,为了实现您想要做的事情(尽管我建议您避免这样做),您可以将帮助程序定义为应用程序文件本身中的 lambdas。在您的情况下,它将是:

def h(txt) 
  "<h1>#{txt}</h1>"
end

# And then the rest of the methods and the routes hash

这样,该h方法就在main对象的上下文中,因此将全部可见。

于 2013-08-09T19:49:04.467 回答