2011-11-22 37 views
117

Trong hành động của tôi, tôi chỉ muốn trả lời khi xử lý nếu nó được gọi từ yêu cầu AJAX. Làm cách nào để kiểm tra?Rails phát hiện nếu yêu cầu là AJAX

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 

Trả lời

233

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

Dưới đây là một ví dụ:

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

Nếu bạn đang sử dụng :remote => true trong các liên kết hoặc các hình thức của bạn, 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 khi respond_to chặn bằng cách gọi số request.xhr?.

+24

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

0

Hãy nhận biết rằng

request.xhr? 

lợi nhuận giá trị số hoặc nil không giá trị BOOLEAN như các tài liệu nói, theo = ~.

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 này:

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

nên

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

Các tài liệu:

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

+0

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

+0

Thực sự có nghĩa là khi được sử dụng trong ngữ cảnh "boolean", bạn phải đối xử với chúng không phải là không phải là boolean, nhưng những cái 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 là falsey trong ruby: 0 || 1 => 0 Nhưng tôi sẽ thay đổi bài viết của tôi cho rõ ràng. – pixelearth

+0

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 tại chỉ số 0, do đó, nó được tìm thấy (và yêu cầu của nó và ajax). Nếu văn bản không tìm thấy kết quả là 'nil', là false. –

Các vấn đề liên quan