Rails phát hiện nếu yêu cầu là AJAX


128

Trong hành động của mình, tôi chỉ muốn phản hồi với việc xử lý nếu nó được gọi từ yêu cầu AJAX. Làm thế nào để tôi kiểm tra?

Tôi muốn làm một cái gì đó như thế này:

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

Câu trả lời:


249

Bạn có thể kiểm tra header[X-Requested-With]xem có phải là yêu cầu AJAX không. Đây là một bài viết tốt về cách làm điều đó.

Đây là một ví dụ:

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

Cảnh báo: điều này không hoạt động trên các remote: truecuộc gọi tiêu chuẩn trong các phiên bản Rails mới hơn, vì các tiêu đề cần thiết không được đặt.
Roland Studer

14

Nếu bạn đang sử dụng :remote => truetrong các liên kết hoặc biểu mẫu của mình, bạn sẽ làm:

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

Bạn cũng có thể kiểm tra trước khối answer_to bằng cách gọi request.xhr?.


26
Yêu cầu ajax không nhất thiết phải trả lời bằng javascript, $.ajax({dataType: 'html'})là ajax đáp ứng với HTML. Cách đúng đắn để làm điều này, là cách thứ hai mà bạn đã đề cậprequest.xhr?
gót chân Pablo Fernandez

3

Các tài liệu nói rằng request.xhr?

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

Nhưng HÃY THỬ

request.xhr? 

trả về giá trị số hoặc số không phải giá trị BOOLESE như các tài liệu nói, phù hợp với = ~.

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

Nó dựa trên điều này:

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

vì thế

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

Các tài liệu:

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


sự khác biệt giữa betwheen truythy và boolean là gì? cả hai đều không đúng / sai?
Arnold Roa

Sự thật có nghĩa là khi được sử dụng trong bối cảnh "boolean", bạn phải coi chúng không phải là booleans, mà là những thứ sẽ được chuyển thành bool. Trên env ['HTTP_X_REQUESTED_WITH'] = ~ / XMLHttpRequest / trả về 0 không sai. Và 0 thực sự là sự thật, không phải chim ưng trong ruby: 0 || 1 => 0 Nhưng tôi sẽ thay đổi bài viết của mình cho rõ ràng.
pixelearth

Nhưng okey của nó là trung thực, số không có nghĩa là văn bản được tìm thấy ở chỉ số 0, vì vậy nó được tìm thấy (và yêu cầu của nó và ajax). Nếu văn bản không được tìm thấy, kết quả nillà sai.
Arnold Roa

2
Có, nhưng quy ước thường dành cho method_name? để trả lại BOOL, vì vậy đây là một gotcha
pixelearth

0

Tôi thích sử dụng before_actioncác bộ lọc. Chúng đặc biệt tốt khi bạn cần cùng một bộ lọc / ủy quyền cho nhiều hành động.

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

0
request.xhr? 

nếu điều này trả về 0 thì có nghĩa là yêu cầu ajax của nó, nếu không nó sẽ trả về nil

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.