2012-03-12 23 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" 

संपादित करें:

समस्या यह है कि POST अनुरोध ताकि विधि allowed? कहा जाता है आवेदन करने के लिए आ रहे हैं । लेकिन जब मैं Rails.application.routes.recognize_path पर कॉल करता हूं तो मुझे Route set not finalized अपवाद मिलता है। कैसे मैं मिडलवेयर 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 में जोड़ा जाता है से प्राप्त कर रहे rack-throttle

की मदद से सटीक नियंत्रक का सही कार्रवाई पर पोस्ट अनुरोध का एक बहुत भेजने से एक उपयोगकर्ता को रोका जा सकता कस्टम

+0

अपने आवेदन में आप अपने रैक :: थ्रॉटल :: अंतराल सम्मिलित है? – shingara

+0

@ शिंगारा इसे 'application.rb' – RomanKapitonov

+0

में शामिल किया गया है? विधि POST विधि में कॉल है या नहीं? क्या आप उस भाग को पेज़ कर सकते हैं जहां आप अपने आवेदन में इस मिडलवेयर को जोड़ते हैं? – shingara

उत्तर

2

सीमक Rails.application.routes.recognize_path का कोड (http://apidock.com/rails/ActionDispatch/Routing/RouteSet/recognize_path) पढ़ने के बाद, इस methode एक दूसरे आर्ग जहां विधि पारित कर सकते हैं मिलता है।

साथ प्रयास करें:

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

सभी विधि काम करता है मुझे लगता है कि यह कर सकते हैं के बाद।

+1

मुझे अभी भी निम्नलिखित 'रनटाइम त्रुटि मिलती है: रूट सेट को 0h/home/rkapitonov/.rvm/gems/ruby-1.9.2-p290/gems/rack-mount-0.8.3/lib/rack/mount/route_set से अंतिम रूप दिया गया है । आरबी: 81: निम्नलिखित 'Rails.application.routes.recognize_path (request.url, {: method => request.request_method}) करने के लिए टाइप करते समय' पहचान 'में – RomanKapitonov

0

यह एक मेरे लिए काम किया, सब पोस्ट अनुरोध को पकड़ने, और उपेक्षा सभी अनुरोधों को प्राप्त करने के लिए:

class CustomLimiter < Rack::Throttle::Interval 

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

end 
संबंधित मुद्दे