अनुरोध AJAX था, तो रेल का पता लगाता है


128

मेरी कार्रवाई में मैं केवल प्रसंस्करण के साथ प्रतिक्रिया करना चाहता हूं अगर इसे AJAX अनुरोध से बुलाया गया था। मैं कैसे जांच करूं?

मैं कुछ इस तरह करना चाहता हूं:

def action
   @model = Model.find(params[:id])

   respond_to do |format|

      if (wasAJAXRequest()) #How do I do this?

         format.html #action.html.erb

      else

         format.html {redirect_to root_url}
   end
end

जवाबों:


249

आप यह देखने के लिए header[X-Requested-With]देख सकते हैं कि यह AJAX का अनुरोध है या नहीं। यहाँ एक अच्छा लेख हैयह कैसे करना है पर ।

यहाँ एक उदाहरण है:

if request.xhr?
  # respond to Ajax request
else
  # respond to normal request
end

चेतावनी: यह remote: trueनए रेल संस्करणों में मानक कॉल पर काम नहीं करता है , क्योंकि आवश्यक हेडर सेट नहीं होते हैं।
रोलैंड स्टडर

14

यदि आप :remote => trueअपने लिंक या फ़ॉर्म का उपयोग कर रहे हैं , तो आप करेंगे:

respond_to do |format|
  format.js { #Do some stuff }

आप कॉल करके response_to ब्लॉक से पहले भी जांच कर सकते हैं request.xhr?


26
Ajax रिक्वेस्ट में जावास्क्रिप्ट के साथ जवाब देना जरूरी नहीं है, $.ajax({dataType: 'html'})ajax है जो HTML के साथ प्रतिक्रिया करता है। ऐसा करने का सही तरीका, दूसरा है जिसका आपने उल्लेख किया हैrequest.xhr?
पाब्लो फर्नांडीज ने

3

डॉक्स का कहना है कि request.xhr?

Returns true if the X-Requested-With header contains XMLHttpRequest”....

लेकिन सावधान रहना

request.xhr? 

= ~ के अनुसार डॉक्स के अनुसार संख्यात्मक या शून्य मान BOOLEAN मान नहीं लौटाता है।

irb(main):004:0> /hay/ =~ 'haystack'
=> 0
irb(main):006:0> /stack/ =~ 'haystack'
=> 3
irb(main):005:0> /asfd/ =~ 'haystack'
=> nil

यह इस पर आधारित है:

# File actionpack/lib/action_dispatch/http/request.rb, line 220
def xml_http_request?
  @env['HTTP_X_REQUESTED_WITH'] =~ /XMLHttpRequest/
end

इसलिए

env['HTTP_X_REQUESTED_WITH'] =~ /XMLHttpRequest/  => 0

डॉक्स:

http://apidock.com/rails/v4.2.1/ActionDispatch/Request/xml_http_request%3F


बेट्वेन ट्रुथि और बूलियन में क्या अंतर है? दोनों सत्य / असत्य नहीं हैं?
अर्नोल्ड रोआ

सत्य का अर्थ है कि जब एक "बूलियन" संदर्भ में उपयोग किया जाता है, तो आपको उन्हें न कि बूलियन के रूप में व्यवहार करना होगा, लेकिन वे जो बूल में डाले जाएंगे। उपरोक्त env ['HTTP_X_REQUESTED_WITH'] = ~ / XMLHttpRequest / रिटर्न 0 गलत है। और ० वास्तव में सत्य है, माणिक में मिथ्या नहीं: ० || 1 => 0 लेकिन मैं अपनी पोस्ट को स्पष्टता के लिए बदलने जा रहा हूं।
Pixearearth

लेकिन सत्य होने के लिए इसका ओके, शून्य का अर्थ है कि पाठ इंडेक्स 0 पर पाया जाता है, इसलिए इसका पाया (और इसके और अनुरोध)। यदि पाठ नहीं मिला, तो परिणाम nilगलत है।
अर्नोल्ड रोआ

2
हां, लेकिन कन्वेंशन आमतौर पर method_name के लिए है? BOOL वापस करने के लिए, इसलिए यह एक
गोचा है

0

मुझे before_actionफिल्टर का उपयोग करना पसंद है । वे विशेष रूप से अच्छे होते हैं जब आपको एक से अधिक क्रियाओं के लिए एक ही फ़िल्टर / प्राधिकरण की आवश्यकता होती है।

class MyController < AuthController
  before_action :require_xhr_request, only: [:action, :action_2]

  def action
    @model = Model.find(params[:id])
  end

  def action_2
    # load resource(s)
  end

  private

  def require_xhr_request
    redirect_to(root_url) unless request.xhr?
  end
end

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.