`
qiezi
  • 浏览: 498677 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

[RoR] 实现一个auto_redirect_to

    博客分类:
  • Ruby
阅读更多
最近在使用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库代码来实现,对于使用者来说基本上是透明的。
分享到:
评论

相关推荐

    RoR性能优化经验谈

    总之,RoR性能优化是一个全面的过程,涵盖从操作系统到Web服务器配置,再到代码本身的改进。每个环节的优化都能显著提升网站的运行效率,使RoR应用能够更好地应对高负载和大规模用户的需求。通过学习和实践这些经验...

    Gibberish:一个 Python Translator Gibberish 模块,它是在我睡前写的,灵感来自 www.reddit.comrswedencomments301sqrdodetot_äror_foföror_lolitote

    一个 Python 的翻译器/乱码模块,它是在我睡前写的,灵感来自 示例用法 - 从命令行运行 #Turn a sentence into gibberish in Swedish &gt;python Gibberish.py -g "My hovercraft is full of eels." "Swedish" ...

    ror中文资料

    Ruby on Rails(RoR)是一个基于Ruby编程语言的开源Web应用框架,遵循MVC(Model-View-Controller)架构模式,旨在简化Web开发过程,提高开发效率。RoR强调“约定优于配置”,提供了一套完整的工具链,使得开发者...

    ROR安装必备所有架包

    `activesupport`是Rails中的另一个核心库,提供了一套实用工具方法和通用库,如日期和时间处理、国际化支持、JSON编码和解码。`activesupport-1.4.4.gem`是这个库的一个旧版本,但依然包含了大量提高代码可读性和...

    ror

    NULL 博文链接:https://xuxiangpan888.iteye.com/blog/266696

    ror实例

    "ror实例"可能指的是在学习或实践中,通过创建一个具体的Rails应用程序来理解和掌握RoR的工作原理和最佳实践。 在Ruby on Rails中,重要知识点包括: 1. **Gemfile与Gemfile.lock**:项目中的Gemfile用于指定项目...

    ROR 文件的上传与下载

    在给定的示例中,使用MySQL数据库创建了一个名为`records`的表,其中包含两个关键字段:`name`和`person`。`name`字段用于存储上传文件的名称,而`person`字段则是一个`MEDIUMBLOB`类型,用于保存上传文件的二进制流...

    初探ROR

    Ruby on Rails(简称ROR)是一个基于Ruby编程语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,旨在促进开发过程的简洁性和效率。Ruby on Rails的核心理念是“Don't Repeat Yourself”(DRY,...

    神经网络ror resenet模型

    ResNet的核心是引入了“残差块”(Residual Block),通过引入一个恒等映射(Identity Mapping)的跳跃连接(Skip Connection),使得网络能够更轻松地学习到输入数据的微小变化。在每个残差块中,输入信号可以直接...

    RoR选题方向—源代码

    在深入研究RoR源代码时,建议先从官方文档和开源项目开始,例如GitHub上的Rails项目,这能帮助你理解框架的设计思路和实现细节。同时,参与开源社区,阅读他人的代码和贡献自己的代码,是提升技能和了解最新实践的好...

    易语言汇编实现左移右移模块

    综上所述,这个模块提供了用汇编语言编写的左移和右移操作,包括循环移位和算术移位,以及一个按位取反的函数。这对于需要在易语言环境下进行底层优化和位操作的开发者来说,是一个宝贵的资源。

    RoRBlog 基于RoR的博客系统

    基于RoR的博客系统,代码风格简单清晰,前后太完善,适合初学者。

    基于sqlite的ror例子

    描述中提到的是一个完整的程序示例,这可能包括了RoR应用的创建、配置、模型定义、迁移以及数据操作等步骤。通常,在RoR中设置SQLite数据库涉及以下步骤: 1. **初始化项目**:使用`rails new`命令创建一个新的RoR...

    我的ror的第一天

    标题 "我的ror的第一天" 暗示了这是一个关于Ruby on Rails(简称RoR)的初学者经验分享,RoR是基于Ruby语言的开源Web应用框架,它遵循MVC(模型-视图-控制器)架构模式,使得开发过程更加高效。 在描述中提到的...

    intimate_web:一个 ROR 应用程序

    "intimate_web" 是一个基于 Ruby on Rails (ROR) 框架开发的应用程序。Ruby on Rails 是一种流行的开源 Web 开发框架,它遵循 Model-View-Controller (MVC) 设计模式,用于构建数据库驱动的 web 应用程序。这个应用...

    实验1 简单IO应用—流水灯控制

    1、亮4个灯、暗4个灯,1亮1暗均匀分布,且...4、采用ROR、ROL循环移位语句(P77)及LOOP语句(P81),实现一个灯从第1个循环点亮到第8个,然后从第8个循环点亮至第1个,一直上下循环。 5、用二进制形式显示自己的学号。

    Windows 上搭建 ROR环境

    - **DevKit作用**:DevKit是一个扩展库,用于增强Ruby的功能,尤其对于编译扩展模块非常有用。 - **下载与安装**: - 访问&lt;http://rubyinstaller.org/downloads&gt; 下载DevKit安装包(例如:DevKit-tdm-32-4.5.2-...

    ror_invoicing_frontend

    ror_invoicing_frontend项目设置yarn install编译和热重装以进行开发yarn serve编译并最小化生产yarn build整理和修复文件yarn lint自定义配置请参阅。

    RoR 培训课程PPT

    - **第一天**:安装配置、哲学思想与MVC模式、创建第一个应用。 - **安装**:介绍了适用于不同操作系统的安装方法,包括InstantRails(Windows)、Locomotive(OSX)、MacPorts以及从源码安装(Linux)等。 - **...

Global site tag (gtag.js) - Google Analytics