[RoR] 实现一个auto_redirect_to

本文介绍了一种在Ruby on Rails中实现Ajax请求时根据不同请求类型进行页面重定向的方法。作者通过修改remote_function函数来区分Updater和Request请求,并实现了auto_redirect_to辅助方法以灵活处理各种情况下的页面跳转。
最近在使用RoR做项目,体会到了快速开发的乐趣,也遇到了一些困难,其中一个就是redirect_to。

我遇到的一个问题是,当使用Ajax更新页面局部内容时,session内容已经过期,这时需要整个页面跳转到登录页面。

直接调用redirect_to会使局部内容显示成登录页面,它是在HTTP头里写入重定向参数来实现的。在我这里的特殊情况下,正确的做法是让它执行一个包含在<script>标记中的脚本,在脚本中更改窗口location值来跳转。

不过RoR中使用Ajax时,会根据:update参数来决定是使用Updater还是Request。如果使用Updater方式,则应返回一段纯脚本;如果是Request方式,应返回一段包括在<script>标记中的脚本;如果是普通方式,就应该使用原有的redirect_to函数了。因为服务端无法区分使用的是哪种方式来请求,所以简单的做法是每个请求都附加一个参数用来区分,不加参数则是普通请求方式。

为了达到这个目的,我修改了prototype_helper中的remote_function函数。这个函数根据传递进来的参数来决定使用Request或是Updater,我就在这里下手:

      def remote_function(options)
        javascript_options 
= options_for_ajax(options)

        update 
= ''
        
if options[:update] and options[:update].is_a?Hash
          update  
= []
          update 
<< "success:'#{options[:update][:success]}'" if options[:update][:success]
          update 
<< "failure:'#{options[:update][:failure]}'" if options[:update][:failure]
          update  
= '{' + update.join(','+ '}'
        elsif options[:update]
          update 
<< "'#{options[:update]}'"
        end

        function 
= update.empty? ? 
          
"new Ajax.Request(" :
          
"new Ajax.Updater(#{update}, "
    
        url_options 
= options[:url]
        ajax_options 
= options[:update] ? {:ajax => 'update'} : {:ajax => 'request'}
        url_options 
=
 url_options.merge(ajax_options)
        url_options 
= url_options.merge(:escape => falseif url_options.is_a? Hash
        function 
<< "'#{url_for(url_options)}'"
        function 
<< ", #{javascript_options})"

        function 
= "#{options[:before]}; #{function}" if options[:before]
        function 
= "#{function}; #{options[:after]}"  if options[:after]
        function 
= "if (#{options[:condition]}) { #{function}; }" if options[:condition]
        function 
= "if (confirm('#{escape_javascript(options[:confirm])}')) { #{function}; }" if options[:confirm]

        
return function
      end

有红色的2行是我添加的,由于这个编辑器的原因,没有显示成整行红色。这2行的作用是判断是否有:update参数,用它来决定是添加ajax=update还是ajax=request。

现在可以实现一个简单的auto_redirect_to了:

  def auto_redirect_to(method, url)
    
case method
    when 
'request'
      request_redirect_to(url)
    when 
'update'
      update_redirect_to(url)
    
else
      redirect_to(url)
    end
  end
  
  def request_redirect_to(url)
    render :update 
do |page|
      page.redirect_to(url)
    end
  end
  
  def update_redirect_to(url)
    render :inline 
=> <<-EOS
      
<script language="javascript">
      
<%=
        render :update 
do |page|
          page.redirect_to(
"#{url_for(url)}")
        end
      
%>
      
</script>
    EOS
  end

使用helper方式使它能够被include到ApplicationController中就行了。

为了不和参数绑得太死,这里把method作为参数由调用者传入。

使用方法,以Login Engine为例,它在access_denied中处理跳转。在ApplicationController中重写这个函数:

    def access_denied
      auto_redirect_to(
params[:ajax], :controller => "/user", :action => "login")
      
false
    end  

现在可以测试了。请求可以是普通的(超链接),Updater方式(请求到一个DIV里),Request方式,现在都能够跳转到正确页面。

ajax参数通过hack库代码来实现,对于使用者来说基本上是透明的。
内容概要:本文介绍了一个针对电力系统连锁故障传播路径的N-k多阶段双层优化及故障场景筛选模型,该模型基于混合整数线性规划(MILP)方法构建,旨在全面评估电力系统在遭受多重故障时的脆弱性与恢复能力。通过引入故障传播路径的概念,模型能够动态模拟故障在电网中的逐级扩散过程,并结合多阶段优化策略,实现对关键故障场景的有效识别与优先排序。整个框架不仅考虑了初始故障元件的选取,还涵盖了后续因潮流转移引发的级联跳闸行为,从而提升了风险评估的准确性与时效性。该研究已在Matlab平台上完成代码实现,具备良好的可复现性和工程应用价值,适用于提升现代电网的安全防御水平。; 适合人群:电力系统、能源安全及相关领域的科研人员、高校研究生以及从事电网规划与运行管理的工程技术人员。; 使用场景及目标:①用于电力系统安全评估中识别最危险的N-k故障组合;②支撑电网应急预案制定与薄弱环节改造;③作为学术研究中关于级联故障建模与优化求解的教学与验证工具;④服务于智能电网背景下抵御蓄意攻击或极端事件的风险防控决策。; 阅读建议:建议读者结合Matlab代码深入理解模型的数学 formulation 与求解流程,重点关注目标函数设计、约束条件构建及双层优化结构的实现逻辑,同时可通过调整系统参数和故障设定进行仿真对比分析,以掌握不同因素对连锁故障演化的影响规律。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值