1

我正在使用带有命名空间的 Sinatra。当我尝试使用条件时,我遇到了一个问题。

这是代码片段

class MainApp < Sinatra::Base
  register Sinatra::Namespace
  set(:role) do |role|
    condition{
      ### DETECT WHERE THIS IS CALLED
      p role
      true
    }
  end

  namespace '/api', :role => :admin do
    before do
      p "before"
    end
    get '/hoo' do
      p "hoo"
    end
  end

  namespace '/api' do
    get '/bar' do
      p "bar"
    end
  end
end

上述代码在访问时向控制台输出以下消息/api/hoo

:admin
:admin
"before"
:admin
"hoo"

我不明白为什么:admin会显示三遍。但是,可能一个来自namespace,其他两个来自beforeget '/hoo'

另一方面,访问/api/bar显示:admin两次。

我只想在之前进行过滤get '/hoo'。有什么想法吗?

注意:我不想将 URL 从更改/api/hoo为类似/api/baz/hoo

4

1 回答 1

1

您可以使用以下命令调试步骤caller

http://ruby-doc.org/core-2.0/Kernel.html#method-i-caller

(注意:我不建议留caller在生产代码中,除非你绝对需要它来进行自省,因为它很慢。)

特别是关于 Sinatra 过滤器,请注意,您至少可以限定它们适用的路线和条件:

http://www.sinatrarb.com/intro#Filters

before '/protected/*' do
  authenticate!
end

before :agent => /Songbird/ do
  # ...
end

我不记得如何获取 http 方法,但是如果您查看 sinatra 源代码,您可能会找到它——我上次查看时,我记得每个get,post等将它们的调用转发到相同的函数,带有方法参数。

于 2013-06-13T12:43:15.063 回答