最近在使用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 => false) if 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性能优化是一个全面的过程,涵盖从操作系统到Web服务器配置,再到代码本身的改进。每个环节的优化都能显著提升网站的运行效率,使RoR应用能够更好地应对高负载和大规模用户的需求。通过学习和实践这些经验...
一个 Python 的翻译器/乱码模块,它是在我睡前写的,灵感来自 示例用法 - 从命令行运行 #Turn a sentence into gibberish in Swedish >python Gibberish.py -g "My hovercraft is full of eels." "Swedish" ...
Ruby on Rails(RoR)是一个基于Ruby编程语言的开源Web应用框架,遵循MVC(Model-View-Controller)架构模式,旨在简化Web开发过程,提高开发效率。RoR强调“约定优于配置”,提供了一套完整的工具链,使得开发者...
`activesupport`是Rails中的另一个核心库,提供了一套实用工具方法和通用库,如日期和时间处理、国际化支持、JSON编码和解码。`activesupport-1.4.4.gem`是这个库的一个旧版本,但依然包含了大量提高代码可读性和...
NULL 博文链接:https://xuxiangpan888.iteye.com/blog/266696
"ror实例"可能指的是在学习或实践中,通过创建一个具体的Rails应用程序来理解和掌握RoR的工作原理和最佳实践。 在Ruby on Rails中,重要知识点包括: 1. **Gemfile与Gemfile.lock**:项目中的Gemfile用于指定项目...
Ruby on Rails(简称ROR)是一个基于Ruby编程语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,旨在促进开发过程的简洁性和效率。Ruby on Rails的核心理念是“Don't Repeat Yourself”(DRY,...
ResNet的核心是引入了“残差块”(Residual Block),通过引入一个恒等映射(Identity Mapping)的跳跃连接(Skip Connection),使得网络能够更轻松地学习到输入数据的微小变化。在每个残差块中,输入信号可以直接...
在深入研究RoR源代码时,建议先从官方文档和开源项目开始,例如GitHub上的Rails项目,这能帮助你理解框架的设计思路和实现细节。同时,参与开源社区,阅读他人的代码和贡献自己的代码,是提升技能和了解最新实践的好...
在给定的示例中,使用MySQL数据库创建了一个名为`records`的表,其中包含两个关键字段:`name`和`person`。`name`字段用于存储上传文件的名称,而`person`字段则是一个`MEDIUMBLOB`类型,用于保存上传文件的二进制流...
基于RoR的博客系统,代码风格简单清晰,前后太完善,适合初学者。
描述中提到的是一个完整的程序示例,这可能包括了RoR应用的创建、配置、模型定义、迁移以及数据操作等步骤。通常,在RoR中设置SQLite数据库涉及以下步骤: 1. **初始化项目**:使用`rails new`命令创建一个新的RoR...
标题 "我的ror的第一天" 暗示了这是一个关于Ruby on Rails(简称RoR)的初学者经验分享,RoR是基于Ruby语言的开源Web应用框架,它遵循MVC(模型-视图-控制器)架构模式,使得开发过程更加高效。 在描述中提到的...
"intimate_web" 是一个基于 Ruby on Rails (ROR) 框架开发的应用程序。Ruby on Rails 是一种流行的开源 Web 开发框架,它遵循 Model-View-Controller (MVC) 设计模式,用于构建数据库驱动的 web 应用程序。这个应用...
1、亮4个灯、暗4个灯,1亮1暗均匀分布,且...4、采用ROR、ROL循环移位语句(P77)及LOOP语句(P81),实现一个灯从第1个循环点亮到第8个,然后从第8个循环点亮至第1个,一直上下循环。 5、用二进制形式显示自己的学号。
- **DevKit作用**:DevKit是一个扩展库,用于增强Ruby的功能,尤其对于编译扩展模块非常有用。 - **下载与安装**: - 访问<http://rubyinstaller.org/downloads> 下载DevKit安装包(例如:DevKit-tdm-32-4.5.2-...
ror_invoicing_frontend项目设置yarn install编译和热重装以进行开发yarn serve编译并最小化生产yarn build整理和修复文件yarn lint自定义配置请参阅。
- **第一天**:安装配置、哲学思想与MVC模式、创建第一个应用。 - **安装**:介绍了适用于不同操作系统的安装方法,包括InstantRails(Windows)、Locomotive(OSX)、MacPorts以及从源码安装(Linux)等。 - **...
这个标题可能是指一个关于如何高效、优雅地实现或使用树结构的教程或者代码分享。 【描述】:虽然描述部分为空,但我们可以推测这篇博文可能详细介绍了如何创建一个“完美”的树结构,可能包括了优化树的操作,如...