2012-03-12 3 views
5

Я использую rack-throttle в качестве ограничивающего скорость двигателя в своем приложении 3 рельсов. Я создал свой собственный класс на основе Rack::Throttle::Interval, чтобы определить пользовательскую логику ограничения скорости. Я проверяю, выполняется ли запрос для точного контроля и точного действия. Это отлично работает, если я сделаю запрос GET. Однако, если я отправлю POST, у меня возникнут некоторые проблемы.Дросселирование POST-запросов в приложении для рельсов

class CustomLimiter < Rack::Throttle::Interval 
    def allowed?(request) 
    path_info = Rails.application.routes.recognize_path request.url rescue path_info = {} 
    if path_info[:controller] == "some_controller" and path_info[:action] == "some_action" 
     super 
    else 
     true 
    end 
    end 
end 

Вот мои действия контроллера

def question 
    #user is redirected here 
end 

def check_answer 
    #some logic to check answer 
    redirect_to question_path 
end 

Мои маршруты

get "questions" => "application#question", :as => "question" 
post "check_answer" => "application#check_answer", :as => "check_answer" 

EDIT:

Проблема заключается в том, что POST запросы приходят к применению, так что метод allowed? называется , Но когда я звоню Rails.application.routes.recognize_path, я получаю исключение Route set not finalized. Как я могу запретить пользователю отправлять много почтовых запросов о точном действии точного управления с помощью rack-throttle

Связующее добавляют в application.rb

class Application < Rails::Application 
    #Set up rate limiting 
    config.require "ip_limiter" 
    config.require "ip_user_agent_limiter" 
    config.middleware.use IpLimiter, :min => 0.2 
    config.middleware.use IpUserAgentLimiter, :min => 2 
end 

Оба IpLimiter и IpUserAgentLimiter получены из пользовательский лимитер

+0

Как вы вставить Rack :: Дроссельная :: Интервал в приложении? – shingara

+0

@shingara он включен в 'application.rb' – RomanKapitonov

+0

Разрешено? метод - вызов методом POST или нет? Можете ли вы заполнить ту часть, где вы добавляете это промежуточное ПО в свое приложение? – shingara

ответ

2

После прочтения кода Rails.application.routes.recognize_path (http://apidock.com/rails/ActionDispatch/Routing/RouteSet/recognize_path) этот метод получает второй аргумент, в котором вы можете передать МЕТОД.

Попробуйте с:

path_info = Rails.application.routes.recognize_path(request.url, {:method => request.request_method}) rescue path_info = {} 

Ведь метод может работать, я полагаю.

+1

Я все еще получаю следующее: RuntimeError: набор маршрутов не завершен из /home/rkapitonov/.rvm/gems/ruby-1.9.2-p290/gems/rack-mount-0.8.3/lib/rack/mount/route_set .rb: 81: в «распознавании» при связывании выполнить следующий «Rails.application.routes.recognize_path (request.url, {: method => request.request_method})' – RomanKapitonov

0

Это один работал для меня, чтобы поймать все запросы POST, и игнорировать все GET запросы:

class CustomLimiter < Rack::Throttle::Interval 

    def allowed?(request) 
    return true unless request.request_method == "POST" 
    super request 
    end 

end 
Смежные вопросы