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が3回表示される理由がわかりませんでした。ただし、1 つは からnamespace、他の 2つは および からである可能性がbeforeありget '/hoo'ます。

一方、アクセス/api/bar:admin2回表示されます。

の前にのみフィルタリングを行いたいだけですget '/hoo'。アイデアはありますか?

/api/hoo注: URLを次のように変更したくありません。/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

gethttp メソッドを取得する方法を思い出すことはできませんが、sinatra のソース コードを見れば、おそらくそれが見つかるでしょうpost。メソッドパラメータで。

于 2013-06-13T12:43:15.063 に答える