요청이 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]aJ가 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({dataType: 'html'})HTML로 응답하는 아약스입니다. 이를 수행하는 올바른 방법은 두 번째로 언급 한 것입니다request.xhr?
Pablo Fernandez heelhook

3

문서는 그 request.xhr?

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

그러나 그 점에 유의하십시오

request.xhr? 

= ~에 따라 문서에서 말하는 것처럼 BOOLEAN 값이 아닌 숫자 또는 nil 값을 반환합니다.

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


truythy와 boolean 사이의 차이점은 무엇입니까? 둘 다 사실이 아닌가?
Arnold Roa

"부울"컨텍스트에서 사용될 때 부울이 아니라 부울로 변환되는 것으로 취급해야한다는 의미가 있습니다. 위의 env [ 'HTTP_X_REQUESTED_WITH'] = ~ / XMLHttpRequest /는 0이 아닌 false를 반환합니다. 그리고 0은 루비에서는 사실이 아니라 거짓입니다 : 0 || 1 => 0 그러나 명확성을 위해 게시물을 변경하려고합니다.
pixelearth

그러나 진실은, 0은 텍스트가 인덱스 0에서 발견되므로 발견 및 (및 ajax 요청) 의미합니다. 텍스트가 없으면 결과는 nil입니다.
Arnold Roa 2012 년

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

0
request.xhr? 

이 값이 0을 반환하면 아약스 요청을 의미하고 그렇지 않으면 nil을 반환합니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.