문제

나는 가고 싶다 MyMiddleware 내 랙 앱에서 실행하지만 특정 경로에 대해서만 실행하십시오. 나는 사용하기를 바랐다 Rack::Builder 아니면 적어도 Rack::URLMap, 그러나 나는 방법을 잘 알 수 없습니다.

이것이 제가 효과가 있다고 생각했지만 그렇지 않습니다.

# in my rackup file or Rails environment.rb:
map '/foo' do
  use MyMiddleware, { :some => 'options' }
end

또는 더 나은 방법으로, Regexp :

map /^foo/ do
  use MyMiddleware, { :some => 'options' }
end

하지만 map 결국 앱을 요구하는 것 같습니다. 통제를 부모에게 전달하는 데 뒤로 물러나지는 않습니다. (실제 오류는 ""undefined method 'each' for nil:NilClass"랙이 끝을 돌리려고 할 때부터 do...end 차단 app.)

중간 전쟁 배열과 경로를 사용하여 경로가 일치하는 경우에만 실행하는 미들웨어가 있습니까?

도움이 되었습니까?

해결책

MyMiddleware가 경로를 점검하고 일치하는 경우 다음 중간 상자에 제어를 전달하지 못하게 할 수 있습니다.

class MyMiddleware
  def initialize app
    @app = app
  end
  def call env
    middlewary_stuff if env['PATH_INFO'] == '/foo'
    @app.call env
  end

  def middlewary_stuff
    #...
  end
end

또는 dslness와 함께 URLMAP를 사용할 수 있습니다. 다음과 같이 보일 것입니다.

main_app = MainApp.new
Rack::URLMap.new '/'=>main_app, /^(foo|bar)/ => MyMiddleWare.new(main_app)

URLMAP는 실제로입니다 그로크하기가 매우 간단합니다.

다른 팁

이것은 작동하지 않습니다 @app 올바른 범위에 존재하지 않습니다.

# in my_app.ru or any Rack::Builder context:
@app = self
map '/foo' do
  use MyMiddleware
  run lambda { |env| @app.call(env) }
end

그러나 이것은 할 것입니다 :

# in my_app.ru or any Rack::Builder context:
::MAIN_RACK_APP = self
map '/foo' do
  use MyMiddleware
  run lambda { |env| ::MAIN_RACK_APP.call(env) }
end

Rack::Builder 첫 번째 논쟁을 줄입니다 map 경로의 앞쪽에서 끝나지 않아 끝없이 되돌아 가지 않습니다. 불행히도, 이것은 경로 접두사가 벗겨진 후에 나머지 경로가 다른 매핑과 제대로 일치 할 가능성이 낮다는 것을 의미합니다.

예는 다음과 같습니다.

::MAIN_APP = self
use Rack::ShowExceptions
use Rack::Lint
use Rack::Reloader, 0
use Rack::ContentLength

map '/html' do
  use MyContentTypeSettingMiddleware, 'text/html'
  run lambda { |env| puts 'HTML!'; ::MAIN_APP.call(env) }
end

map '/xml' do
  use MyContentTypeSettingMiddleware, 'application/xml'
  run lambda { |env| puts 'XML!'; ::MAIN_APP.call(env) }
end

map '/' do
  use ContentType, 'text/plain'
  run lambda { |env| [ 200, {}, "<p>Hello!</p>" ] }
end

간다 /html/xml 다음이 로그로 이동합니다.

HTML!
XML!
127.0.0.1 - - [28/May/2009 17:41:42] "GET /html/xml HTTP/1.1" 200 13 0.3626

즉, 앱이 맵핑되었습니다 '/html' 스트립 '/html' 접두사와 호출은 이제 매핑 된 앱과 일치합니다. '/xml'.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top