ruby-on-rails - 如果 AJAX 调用未经授权,则重定向到登录页面
问题描述
我有一个表单,当您单击submit
它时,它将进行 AJAX 调用以更新您要更改的内容。我的用户会话将在 4 小时后过期,因此如果用户想要更新表单并且他的会话同时过期,它将呈现一条 Flash 消息,要求重新加载页面并再次登录。
尝试使用Cucumber
,测试此行为时Capybara
,由于未呈现 flash 消息,因此永远不会收到 AJAX 响应Selenium
。Chrome
(如果我手动测试它就可以了)
我已经运行了另一个测试,该测试在执行另一个也使用 AJAX 的操作时呈现 Flash 消息并且它成功了。不同之处在于,一个动作会立即呈现视图,而失败的动作会重定向到另一条路径然后呈现。所有控制器都从检查用户是否被授权的同一个 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
wait_for_ajax_call_to_finish
基本上只睡几秒钟
这是失败的操作:
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.")
这就是我使 cookie 过期的方式:
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
谢谢!
解决方案
推荐阅读
- node.js - 标头未定义。运行角度万能时
- arrays - 当反应状态是数组时,无法读取未定义的属性“目的地”
- azure - Azure Active Directory B2C 集成
- database - 我无法在 Neo4j 中将以下代码更改为 if-else 条件
- mongodb - 蒙戈 | 警告:没有隐式会话:逻辑会话仅在服务器版本 3.6 和更高版本上受支持
- java - java程序在不同平台上执行速度一样吗?
- ros - 将点云数据从毫米波传感器转换为激光扫描
- phoenix-framework - 困境:我应该使用模块插件还是功能插件:Phoenix
- javascript - 如何为六边形网格着色,使其没有相同颜色的邻居?
- java - 尝试设置 GWT 项目时未找到注释处理器“com.google.web.bindery.requestfactory.apt.RfValidator”错误