Rails ตรวจสอบว่าคำขอเป็น 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โทรมาตรฐานใน Rails เวอร์ชันใหม่เนื่องจากไม่ได้ตั้งค่าส่วนหัวที่จำเป็น
Roland Studer

14

หากคุณใช้:remote => trueในลิงก์หรือแบบฟอร์มของคุณคุณจะต้องทำ:

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

นอกจากนี้คุณยังสามารถตรวจสอบก่อนที่จะบล็อก respond_to request.xhr?โดยการเรียก


26
คำขอ ajax ไม่จำเป็นต้องตอบกลับด้วย javascript แต่$.ajax({dataType: 'html'})ajax ที่ตอบสนองด้วย HTML วิธีที่ถูกต้องเป็นวิธีที่สองที่คุณกล่าวถึงrequest.xhr?
Pablo Fernandez heelhook

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


betwheen truythy และ boolean ต่างกันอย่างไร ทั้งสองไม่จริง / เท็จ?
Arnold Roa

ความจริงหมายความว่าเมื่อใช้ในบริบท "บูลีน" คุณต้องปฏิบัติต่อสิ่งเหล่านี้ไม่ใช่ไม่ใช่บูลีน แต่เป็นสิ่งที่จะถูกส่งไปยังบูล เหนือ env ['HTTP_X_REQUESTED_WITH'] = ~ / XMLHttpRequest / คืนค่า 0 ไม่ใช่เท็จ และ 0 คือความจริงไม่ใช่เท็จในทับทิม: 0 || 1 => 0 แต่ฉันจะแก้ไขโพสต์ของฉันเพื่อความชัดเจน
pixelearth

แต่โอเคที่จะเป็นจริงศูนย์หมายความว่าพบข้อความที่ดัชนี 0 ดังนั้นจึงพบ (และคำขอของมันและ ajax) หากไม่พบข้อความผลลัพธ์จะnilเป็นเท็จ
Arnold Roa

2
ใช่ แต่โดยทั่วไปการประชุมนี้ใช้สำหรับ method_name? เพื่อคืน BOOL นี่คือ gotcha
pixelearth

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.