Ruby on rails 如果AJAX调用未经授权,请将_重定向到登录页面

Ruby on rails 如果AJAX调用未经授权,请将_重定向到登录页面,ruby-on-rails,ajax,cucumber,selenium-chromedriver,capybara,Ruby On Rails,Ajax,Cucumber,Selenium Chromedriver,Capybara,我有一个表单,当您单击submit时,它将发出一个AJAX调用来更新您想要更改的内容。我的用户会话将在4小时后过期,因此,如果用户希望更新表单,而他的会话在此期间已过期,则会显示一条闪光消息,要求重新加载页面并再次登录 尝试使用Cucumber、Capybara、Selenium和Chrome测试此行为时,由于未呈现flash消息,因此从未收到AJAX响应。(如果我手动测试,它工作得很好) 我已经运行了另一个测试,在执行另一个同样使用AJAX的操作时呈现flash消息,并且成功了。不同之处在于,

我有一个表单,当您单击
submit
时,它将发出一个AJAX调用来更新您想要更改的内容。我的用户会话将在4小时后过期,因此,如果用户希望更新表单,而他的会话在此期间已过期,则会显示一条闪光消息,要求重新加载页面并再次登录

尝试使用
Cucumber
Capybara
Selenium
Chrome
测试此行为时,由于未呈现flash消息,因此从未收到AJAX响应。(如果我手动测试,它工作得很好)

我已经运行了另一个测试,在执行另一个同样使用AJAX的操作时呈现flash消息,并且成功了。不同之处在于,一个操作会立即渲染视图,而失败的操作会重定向到另一个路径,然后进行渲染。所有控制器都继承自同一BaseController,该BaseController检查用户是否获得授权

会话到期后,我调用提交表单,该表单包含以下步骤:

When /^I submit the form$/ do
  generic_form_page = GenericFormPage.new(Capybara.current_session)
  generic_form_page.submit

  if Capybara.current_session.mode == :poltergeist
    ajax_page = GenericAjaxPage.new Capybara.current_session
    ajax_page.wait_for_ajax_call_to_finish
  else
    Selenium::WebDriver::Wait.new(:timeout => 50)
  end
  sleep 5
end
等待\u ajax\u调用\u完成
基本上只是睡几秒钟

这是失败的操作:

  def update
    @element = Element.find(params[:id])
    if @element.update_attributes(element_params)
      render :json => { :location => another_path(@element.item) }
    else
      render :action => 'edit', :layout => false
    end
  end
正在进行的行动:

  def edit
    @element = Element.find(params[:id])
    @item = @element.item
    render :layout => false
  end
AJAX消息如下:

handle_ajax_errors = (event, request, settings) ->
  if request.status == 401
    render_flash_error_message("Your session has timed out. Please refresh the page.")
  else
    render_flash_error_message("We're sorry. An error has occurred.")
这是我如何使cookies过期的:

browser = Capybara.current_session.driver.browser
  if browser.respond_to?(:clear_cookies)
    # Rack::MockSession
    browser.clear_cookies
  elsif browser.respond_to?(:manage) and browser.manage.respond_to?(:delete_all_cookies)
    # Selenium::WebDriver
    browser.manage.delete_all_cookies
  else
    raise "Don't know how to clear cookies. Weird driver?"
  end

谢谢

您的test.log显示了与正在发出的请求相关的哪些内容?您在哪里/如何使测试中的会话过期?另外-
Selenium::WebDriver::Wait.new(:timeout=>50)
除了创建一个类Wait的ojbect,然后放弃之外,什么也不做it@ThomasWalpolelog没有说任何相关的内容,因为我正在测试的操作没有显示任何错误
Selenium::WebDriver::Wait.new(:timeout=>50)
可能什么也做不了,但我尝试了
sleep40
和failed@ThomasWalpole它在使用Firefox浏览器时有效,但在Chrome浏览器中无效。(但是我很难让firefox在CircleCI上工作,但是test.log是否显示重定向响应?它是否显示接收到的Ajax请求?它是否显示预期的请求/响应?您的test.log显示了与正在发出的请求相关的哪些内容?您在测试中的会话在哪里/如何过期?另外-
Selenium::WebDriver::Wait.new(:timeout=>50)
除了创建一个类Wait的ojbect,然后放弃之外,什么都不做it@ThomasWalpoletest.log没有说任何相关的内容,因为我正在测试的操作没有显示任何错误。
Selenium::WebDriver::Wait.new(:timeout=>50)
可能什么也做不了,但我尝试了
睡眠40
和failed@ThomasWalpole它在使用Firefox浏览器时有效,但在Chrome浏览器中无效。(但是我很难让firefox在CircleCI上工作,但是test.log是否显示重定向响应?是否显示接收到的Ajax请求?是否显示预期的请求/响应?