- 浏览: 686532 次
- 性别:
- 来自: 中山
文章分类
最新评论
-
wuhuizhong:
jFinal支持Rest风格吗?可以想spring mvc那样 ...
在JFinal的Controller中接收json数据 -
wuhuizhong:
在jfinal中应如何获取前端ajax提交的Json数据?ht ...
在JFinal的Controller中接收json数据 -
wuhuizhong:
jfinal如何处理json请求的数据:问题: 在某些api接 ...
在JFinal的Controller中接收json数据 -
wuhuizhong:
Ubuntu14.04 安装 Oracle 11g R2 Ex ...
Oracle 11g release 2 XE on Ubuntu 14.04 -
alanljj:
这个很实用,已成功更新,谢过了!
odoo薪酬管理模块l10n_cn_hr_payroll
Handling Rails 404 and 500 errors
I spent a couple of hours trying to figure out how to handle 404 and 500 errors in Rails. This is not simple and actually really annoying. Hopefully future versions clean this up because right now it sucks pretty badly. Anyways, I found a page on the wiki and some other blogs, but the issue was that they wouldn’t handle all the cases. So, here’s the solution:
1. Edit your app/controllers/application.rb file and add these three methods:
def rescue_404
rescue_action_in_public CustomNotFoundError.new
end
def rescue_action_in_public(exception)
case exception
when CustomNotFoundError, ::ActionController::UnknownAction then
#render_with_layout "shared/error404", 404, "standard"
render :template => "shared/error404", :layout => "standard", :status => "404"
else
@message = exception
render :template => "shared/error", :layout => "standard", :status => "500"
end
end
def local_request?
return false
end
The first method will be explained in the next step. The second method is the method that Rails calls to handle most errors. This method will not capture a certain class of errors where neither the controller nor the action requested exist. The third method tells rails to stop sucking. Normally Rails handles requests made to localhost or 127.0.0.1 differently than all others. This might be for debugging purposes, but it sucks when testing error handling.
2. Edit config/routes.rb and add this line TO THE END OF THE FILE:
map.connect '*path', :controller => 'application', :action => 'rescue_404' unless ::ActionController::Base.consider_all_requests_local
This tells Rails that if it can’t find any other route to handle the request (i.e. the *path) it should call the rescue_404 action on the application controller (the first method above).
3. Edit config/environments/development.rb and add this line:
ActionController::Base.consider_all_requests_local = false
This additionally tells Rails to stop sucking and stop handling requests to localhost and 127.0.0.1 differently.
Anyways, happy coding.
map.connect “*anything”, :controller => “your_controller”, :action => “your_action”
params[:anything]
http://henrik.nyh.se/2008/07/rails-404
http://6brand.com/rails-custom-404-pages.html
Rails全局处理Error
查看Rails源码 :actionpack/lib/action_controller/rescue.rb:
def rescue_action_in_public(exception) #:doc:
render_optional_error_file response_code_for_rescue(exception)
end
我们可以重写这个方法,application.rb中:
def rescue_action_in_public(exception)
case exception.class.name
when
'ActiveRecord::RecordNotFound','::ActionController::UnknownAction','::ActionController::RoutingError'
RAILS_DEFAULT_LOGGER.error("404 displayed")
render(:file => "#{RAILS_ROOT}/public/404.html", :status => "404 Error")
else
RAILS_DEFAULT_LOGGER.error("500 displayed")
render(:file => "#{RAILS_ROOT}/public/500.html", :status => "500 Error")
end
end
然后注意,这里rescue_action_in_public方法是只对production环境有用的,在developmen模式下不起作用
我们继续看源码:
def rescue_action(exception)
log_error(exception) if logger
erase_results if performed?
# Let the exception alter the response if it wants.
# For example, MethodNotAllowed sets the Allow header.
if exception.respond_to?(:handle_response!)
exception.handle_response!(response)
end
if consider_all_requests_local || local_request?
rescue_action_locally(exception)
else
rescue_action_in_public(exception)
end
end
注
意最后那个if语句,这里是判断request是否来自本地的请求,当为development下,被rescue_action_locally方法处
理exception,但是我们如果在application里重写rescue_action_locally方法,就可以自由的测试开发了。如下:
#for development
def rescue_action_locally(exception)
case exception.class.name
when 'ActiveRecord::RecordNotFound','::ActionController::UnknownAction','::ActionController::RoutingError'
RAILS_DEFAULT_LOGGER.error("404 displayed")
render(:file => "#{RAILS_ROOT}/public/404.html", :status => "404 Error")
else
RAILS_DEFAULT_LOGGER.error("500 displayed")
render(:file => "#{RAILS_ROOT}/public/500.html", :status => "500 Error")
end
end
rails出错的时候,一般都是跳转到错误跟踪的页面下,这样在开发环境下是很好的,但是对正式环境就不是太友好了,所以如果你想自定义一下出错的页面,还是有办法的.
我一般都会在lib目录下新建一个ooxx.rb文件存放下面的代码,然后在environment.rb下加载一下.
environment.rb
require File .join( File .dirname(__FILE__), '..' , 'lib' , 'ooxx' )
require File.join(File.dirname(__FILE__),'..', 'lib','ooxx')
ooxx.rb
module ActionController
module Rescue
protected
#自定义的错误处理
def rescue_action_in_public(exception)
logger.error("rescue_action_in_public executed")
# 这里就是你可以折腾的地方
case exception
when ActiveRecord::RecordNotFound, ::ActionController::RoutingError,
::ActionController::UnknownAction
logger.error("404 displayed")
render(:file => "#{RAILS_ROOT}/public/404.html",
:status => "404 Not Found")
else
logger.error("500 displayed")
render(:file => "#{RAILS_ROOT}/public/500.html",
:status => "500 Error")
# SystemNotifier.deliver_exception_notification(self, request,
# exception)
end
end
end
end
请注意做完以上操作后,在开发环境下,照样会跳转到错误跟踪页面的,这是因为这个方法是否起作用取决于development.rb和production.rb中的配置:
# in production.rb
config.action_controller.consider_all_requests_local = false
# in development.rb
config.action_controller.consider_all_requests_local = true
发表评论
-
使用Torquebox在Windows下面进行Rails的部署
2013-12-16 07:16 1092一、安装Torquebox 参考:http://torqu ... -
ruby匹配中文的正则表达
2013-07-16 21:12 1917ruby1.9: /\p{Word}+/u 不限于 a ... -
Ruby On Rails, Thin and Nginx on Windows
2012-01-08 07:23 1828安装thin: gem install eventmachi ... -
搭建rubygem repository server
2011-11-14 13:06 1025做rails开发通常需要gem i ... -
在 Heroku 安裝 Redmine (1.1-stable)
2011-11-13 09:59 1064Redmine 是一套好用的軟 ... -
Rails之记录用户操作数据库信息
2011-11-10 02:50 1179db/migrate/002_add_audit_trails ... -
Rails3部署到heroku
2011-11-10 02:47 700gem install heroku rails new m ... -
Rails Cache
2011-11-10 02:20 689Rails Cache http://www.slid ... -
How do I use ActiveSupport core extensions?
2011-11-07 17:04 486When I try to use 1.week.ago ... -
Redhat安裝 nokogiri 時要求升級 libxml2
2011-11-07 16:58 2264安裝 nokogiri 時出現以下錯誤信息: Install ... -
Compass Agile Enterprise Framework
2011-11-07 06:37 722设置: 1.Gemfile gem 'erp_agreem ... -
Linux下Rails 3.1安装sqlite3
2011-10-25 08:29 1147服务器系统是Red Hat 4.1.2-48。默认已安装sql ... -
Ubuntu Server 64bits 如何安装 ruby-oci8
2011-10-23 06:56 3030安装 Linux软件包 : sudo apt- ... -
将gem包打成jar包
2011-10-16 11:45 825http://www.intellij.org.cn/blog ... -
升級到 Rails 3.1,專案所要做的前置準備工作
2011-10-14 14:28 643http://wp.xdite.net/?p=3137 ... -
Ruby 调用Shell脚本
2011-10-13 15:13 2894// 第一种 用反引号将shell命令引起来,如果是sh ... -
Ruby通过SOAP调用webservice发送短信
2011-10-06 11:27 1609url = 'http://lxt.esms360.co ... -
Sending delayed email from devise
2011-09-27 14:39 656Alternatively, instead of using ... -
让邮件发送也变得有序
2011-09-27 14:10 595邮件发送应该是一个网站中不可或缺的功能,但如果同时触发了大量的 ... -
rails 3 中 生成pdf 2: email pdf 附件
2011-09-27 13:31 991ActionMailer in Rails 3 http:/ ...
相关推荐
Gaffe使在Rails应用程序中自定义错误页面变得容易。 它利用了Rails 3.2(显然是4.0+)中存在的一项功能,即exceptions_app 。 它带有默认错误页面,但是可以很容易地覆盖它们(您应该这样做)。 默认错误页面如下所...
Simple Form能够自动处理模型验证错误,将错误信息显示在相应的输入字段下方。无需额外的代码,就能实现良好的用户体验。 5. **自定义样式和布局** Simple Form允许开发者灵活地定制表单的外观。可以设置`:...
6. **错误处理**:Rails API鼓励返回标准的HTTP状态码和结构化的错误消息,以便客户端可以理解并适当地处理错误。 7. **JSON Schema**:通过使用JSON Schema,开发者可以定义API的数据结构和验证规则,增强API的可...
以下是一些常见的Rails错误及其解决方法。 1. **NoMethodError**:这是Rails中最常见的错误之一,通常表示尝试调用一个不存在的方法。检查代码中是否存在拼写错误或未定义的方法,确保引用的实例变量正确,并且在...
模型负责数据操作,视图用于展示用户界面,而控制器则作为两者之间的桥梁,处理用户请求并调用模型方法。在Aptana中,你可以直接在这些目录中编写相应的Ruby代码,IDE会提供代码补全和错误检查等功能。 例如,要在...
Rails提供了一些内建的错误处理机制,如 rescued exceptions 和 custom error classes。同时,模型中的validations可以帮助确保数据在被保存到数据库之前满足一定的条件。 测试是Rails开发流程的重要部分。Rails...
可以通过rescue_from或自定义异常类来捕获和处理错误。 七、安全与认证: API的安全性至关重要。常见的安全策略包括OAuth2、JWT(JSON Web Tokens)或API密钥。Rails提供如devise_token_auth这样的库来协助实现这些...
- **Rack**:Rack是Ruby Web应用的一个接口规范,Rails基于Rack实现了自己的请求处理流程。 - **ActionDispatch**:ActionDispatch是Rails中处理HTTP请求的核心模块,负责解析请求并将请求分发到合适的控制器方法。 ...
- **深入实践CRUD功能**:详细讲解如何具体实现CRUD操作,包括数据验证、错误处理等高级特性。 - **MVC架构与RESTful概念**:介绍模型(Model)、视图(View)、控制器(Controller)三者之间的关系以及RESTful API的设计...
5. **错误处理**:定义一套统一的错误处理策略,当请求无法正确处理时能够向客户端返回清晰的错误信息。 6. **性能优化**:考虑使用缓存、异步处理等方式提高API的响应速度和并发能力。 ### 四、示例:创建一个简单...
Ruby 1.8.7引入了块参数、内建的JSON支持以及改进的错误处理机制等,使得开发者能够更高效地编写代码。 Rails 2.2.3则是Rails框架的一个旧版本,发布于2009年。尽管现在有更先进的Rails版本,但在当时,Rails 2.2.3...
在Rails 3.2中,ActionMailer改进了配置和错误处理,使得邮件发送更加稳定可靠。 4. **ActiveRecord**:这是Rails的ORM(对象关系映射)层,它允许开发者使用Ruby来操作数据库,而无需编写SQL。Rails 3.2的...
例如,当一个链接或表单标记为`remote: true`时,Rails会默认使用Ajax处理请求。此外,`data-*`属性用于传递额外的信息,如HTTP方法(GET或POST)和回调函数。 **jQuery与Rails的结合** 在Rails早期版本中,经常...
`weixin_rails_middleware` 是基于 Ruby 的 Rack 技术构建的,它能够插入到 Rails 应用的请求处理流程中。当收到微信服务器发来的请求时,中间件会自动处理这些请求,如验证签名、解析XML数据,并提供相应的响应。 ...
文件 "nginxx_template.conf" 可能是一个自定义的Nginx配置模板,用于指定如何处理Rails应用的请求。配置中可能包含以下部分: - `server` 块定义了一个监听特定端口的服务器实例。 - `location` 块指定了Nginx...
在Ruby on Rails框架中,Paperclip是一个非常流行的用于处理文件上传的库。它提供了一种简单而优雅的方式来管理和处理模型中的附件,如图片、文档等。Paperclip与ActiveRecord紧密集成,使得在Rails应用中添加文件...
10. **错误和调试**:如何追踪和修复常见的Rails问题。 通过这本书,读者不仅可以学习到Rails的使用方法,还能了解到良好的开发实践和技巧,提升自己的Rails开发技能。同时,博客链接提供的额外资源可作为补充学习...
2. **与Rails集成**:Ruby-Karafka很好地与Rails生态系统兼容,允许开发者利用已有的Rails应用基础设施,如配置、日志和错误处理。 3. **自动消费者组管理**:框架自动处理Kafka的消费者组管理,确保消息的正确分发...
- **处理验证错误**:展示如何处理验证失败的情况,并返回适当的错误信息。 - **在视图中显示验证错误**:教授如何在前端视图中优雅地显示验证错误。 #### ActiveRecord回调 - **对象的生命周期**:解释...