2012-03-12 43 views
5

Tôi đang sử dụng rack-throttle làm công cụ hạn chế tốc độ trong ứng dụng đường ray 3 của mình. Tôi đã tạo lớp của riêng mình dựa trên Rack::Throttle::Interval để xác định logic giới hạn tốc độ tùy chỉnh. Tôi đang kiểm tra nếu yêu cầu được thực hiện cho bộ điều khiển chính xác và hành động chính xác. Điều này làm việc tốt nếu tôi thực hiện yêu cầu GET. Tuy nhiên, nếu tôi gửi yêu cầu POST tôi gặp một số vấn đề.Điều chỉnh yêu cầu POST trong ứng dụng đường ray

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 

Dưới đây là những hành động điều khiển của tôi

def question 
    #user is redirected here 
end 

def check_answer 
    #some logic to check answer 
    redirect_to question_path 
end 

tuyến My

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

EDIT:

Vấn đề là POST yêu cầu được đến ứng dụng vì vậy phương pháp mà allowed? được gọi là . Nhưng khi tôi gọi Rails.application.routes.recognize_path tôi nhận được ngoại lệ Route set not finalized. Làm thế nào tôi có thể ngăn chặn một thành viên gửi rất nhiều bài yêu cầu về hành động chính xác của bộ điều khiển chính xác với sự giúp đỡ của rack-throttle

Các middleware được thêm vào trong 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 

Cả IpLimiterIpUserAgentLimiter có nguồn gốc từ tùy chỉnh giới hạn

+0

Làm thế nào có bạn chèn rack của bạn :: Throttle :: Interval trong ứng dụng của bạn? – shingara

+0

@shingara được bao gồm trong 'application.rb' – RomanKapitonov

+0

Được phép? phương thức nào được gọi trong phương thức POST hay không? Bạn có thể pase phần mà bạn thêm middleware này trong ứng dụng của bạn? – shingara

Trả lời

2

Sau khi đọc mã của Rails.application.routes.recognize_path (http://apidock.com/rails/ActionDispatch/Routing/RouteSet/recognize_path), hàm này có một số thập phân thứ hai, nơi bạn có thể vượt qua PHƯƠNG PHÁP.

Hãy thử với:

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

Sau khi tất cả các phương pháp có thể làm việc Tôi cho rằng.

+1

Tôi vẫn nhận được sau 'RuntimeError: tuyến đường thiết lập không hoàn thành từ /home/rkapitonov/.rvm/gems/ruby-1.9.2-p290/gems/rack-mount-0.8.3/lib/rack/mount/route_set .rb: 81: trong 'nhận dạng'' khi buộc phải làm như sau' Rails.application.routes.recognize_path (request.url, {: method => request.request_method}) ' – RomanKapitonov

0

một này làm việc cho tôi, để đón tất cả các yêu cầu POST, và bỏ qua tất cả các yêu cầu GET:

class CustomLimiter < Rack::Throttle::Interval 

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

end 
Các vấn đề liên quan