Рейки виявляють, чи був запит 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]чи є це запитом 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 }

Ви також можете перевірити перед блоком respo_to, зателефонувавши request.xhr?.


26
Запит 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


Яка різниця між вірними та булевими? обидва не є правдивими / хибними?
Арнольд Роа

Truthy означає, що, використовуючи їх у "булевому" контексті, ви повинні ставитися до них не як до булевих, а до тих, які будуть кинуті на bool. Вище env ['HTTP_X_REQUESTED_WITH'] = ~ / XMLHttpRequest / повертає 0 неправдиво. І 0 насправді триє, а не фальси в рубіні: 0 || 1 => 0 Але я хочу змінити свою посаду для наочності.
пікселеарт

Але його okey бути truthy, нуль означає, що текст знайдено в індексі 0, тому його знайдено (і його і ajax запит). Якщо тексту не знайдено, результат nilє хибним.
Арнольд Роа

2
Так, але загалом це умова для ім'я методу? щоб повернути BOOL, тож це
gotcha

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, то це означає його запит на ajax, інакше він поверне нуль

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.