programing

요구가 AJAX인지 아닌지를 Rails가 검출합니다.

sourcejob 2023. 3. 25. 11:03
반응형

요구가 AJAX인지 아닌지를 Rails가 검출합니다.

제 액션에서는 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

체크할 수 있습니다.header[X-Requested-With]AJAX 요청인지 확인합니다.여기 그것을 하는 방법에 대한 좋은 기사가 있다.

다음은 예를 제시하겠습니다.

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

사용하시는 경우:remote => true링크 또는 양식에서 다음을 수행할 수 있습니다.

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

또한 response_to block 전에 콜을 통해 확인할 수도 있습니다.request.xhr?.

업데이트:

Rails 6.1.0에서는xhr?()는 실제로 부울값을 반환합니다.

https://github.com/rails/rails/commit/0196551e6039ca864d1eee1e01819fcae12c1dc9#diff-60b77e427ea7ba142faa477fac10b8d0134cede4e35a3b1953c425200fadf1acL267-L269


원답:

의사가 그 요청.xhr이라고 하던데요?

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

단, 다음 점에 주의해 주십시오.

request.xhr? 

=~에 따라 문서에서 말하는 BOUAL 값이 아닌 숫자 또는 0 값을 반환합니다.

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

사용하는 것을 좋아합니다.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
request.xhr? 

이 값이 0을 반환하면 Ajax 요청을 의미하고 반환되지 않으면 0을 반환합니다.

사용하시는 경우:remote => true링크, 양식에서, 당신의 응답은 HTML, JSON 등이 아닌 js 형식으로 올 것입니다.

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

   respond_to do |format|
           format.js
      if (wasAJAXRequest()) #How do I do this?

         format.html #action.html.erb

      else

         format.html {redirect_to root_url}
      end
   end
end

또한 액션에 적합한 js 파일을 작성해야 합니다.이 경우 액션명은 액션입니다.파일명은 다음과 같습니다.action.js.erb또, 액션 코드를 내부로 이동합니다.action.js.erb파일

언급URL : https://stackoverflow.com/questions/8220701/rails-detect-if-request-was-ajax

반응형