2011-01-27 14 views
5

मैं एक साधारण रैक मिडलवेयर "हैलो वर्ल्ड" का प्रयास करना चाहता हूं, लेकिन मुझे अटक जाना प्रतीत होता है। मुख्य sytax तरह बदल यह लग रहा है, के बाद से कुछ उदाहरण इस कोड का उपयोग:रेल के साथ हैलो वर्ल्ड रैक मिडलवेयर 3: सभी अनुरोधों के शरीर को कैसे संसाधित करें

undefined method `<<' for #<ActionDispatch::Response:0x103f07c48> 

यहां तक ​​कि जब मैं वहाँ बाहर अन्य कोड को देखो, मैं उन्हें पाने के लिए प्रतीत नहीं कर सकते हैं:

require 'rack/utils' 

class FooBar 

    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    status, headers, body = @app.call(env) 
     body.body << "\nHi from #{self.class}" 
     [status, headers, body] 
    end 
end 

एक त्रुटि पैदा करता है रेल 3.0.3 के साथ चल रहा है।

यहाँ मेरी ठोस प्रश्न हैं:

  • मैं कैसे एक रेल app से चलाने के लिए और किसी भी उत्पादन के शरीर को संशोधित करने के लिए एक सरल रैक मिडलवेयर मिल सकता है?
  • मुझे Rails.application.config.middleware.use घोषणा कहां रखना चाहिए? (मैंने उस के लिए कॉन्फ़िगर/प्रारंभकर्ताओं में अपना प्रारंभिक प्रारंभकर्ता बनाया है)

बहुत पहले से धन्यवाद!

# in config/application.rb 
config.middleware.use 'FooBar' 

# in config/initializers/foo_bar.rb 
class FooBar 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    status, headers, response = @app.call(env) 
    [status, headers, response.body << "\nHi from #{self.class}"] 
    end 
end 

की सलाह दी हो, उस पर लगभग हर दूसरे अनुरोध (कम से कम रेल 3.0.3 पर), यह एक और मिडलवेयर (रैक के कारण असफल हो जायेगी:

उत्तर

6

यह वही है कि आप इसे करना चाहते हैं करना चाहिए: : हेड) क्योंकि सामग्री अपरिवर्तित होने पर यह एक खाली अनुरोध भेजता है। हम प्रतिक्रिया में कॉल करने में सक्षम होने के आधार पर इस उदाहरण में हैं। लेकिन, वास्तव में, सरणी का अंतिम सदस्य कुछ भी हो सकता है जो प्रतिक्रिया देता है।

रयान बेट्स बहुत अच्छी तरह से यहाँ रैक के ऊपर जाता है:

http://asciicasts.com/episodes/151-rack-middleware

http://railscasts.com/episodes/151-rack-middleware

और सरकारी रेल गाइड भी बहुत अच्छी है:

http://guides.rubyonrails.org/rails_on_rack.html

और निश्चित रूप से आधिकारिक रैक स्पेक:

http://rack.rubyforge.org/doc/SPEC.html

6

रेल 3.2.12+:

previous जवाब रेल के लिए काम नहीं करता है 3.2.12+

यह एक करता है:

# in config/application.rb 
config.middleware.use 'FooBar' 

# in config/initializers/foo_bar.rb 
class FooBar 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    status, headers, response = @app.call(env) 
    response.body += "\nHi from #{self.class}" 
    # response.body << "..." WILL NOT WORK 
    [status, headers, response] 
    end 
end 
संबंधित मुद्दे