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