Rails определяет, был ли запрос AJAX

126

В своем действии я хочу отвечать только обработкой, если он был вызван из запроса 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
Теги:

3 ответа

227
Лучший ответ

Вы можете проверить header[X-Requested-With], чтобы убедиться, что это запрос AJAX. Вот хорошая статья о том, как это сделать.

Вот пример:

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

Если вы используете :remote => true в своих ссылках или формах, вы должны:

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

Вы также можете проверить перед блоком reply_to, вызвав request.xhr?.

  • 24
    Запрос ajax не обязательно должен отвечать javascript, $.ajax({dataType: 'html'}) - это ajax, который отвечает HTML. Правильный способ сделать это, второй вы упомянули request.xhr?
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

  • 0
    Какая разница между истинным и логическим? оба не верны / ложны?
  • 0
    Правдиво означает, что при использовании в «логическом» контексте вы должны обращаться с ними не как с логическими, а с теми, которые будут преобразованы в bool. Выше env ['HTTP_X_REQUESTED_WITH'] = ~ / XMLHttpRequest / возвращает 0, не ложное. И 0 на самом деле правда, а не фальси в рубине: 0 || 1 => 0 Но я собираюсь изменить свой пост для ясности.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню