如何在查看之前检查变量是否在控制器中出错。
在我的控制器中:
def index
@sample_model = Model.all
rescue => e
flash.now[:alert] = e.message
end
例如我有错误ActiveRecord::StatementInvalid: Mysql2::Error: Table 'models' doesn't exist: ...
我想在查看前先检查一下是否可以显示我的闪光灯。
答案 0 :(得分:4)
我期待看到解决方案(这本身不是答案);我想强调几点:
我想先查看是否先查看所以我可以将它显示给我 闪光灯。强>
您希望如何在闪光灯中显示错误?
很多时候,这种性质的错误会导致等同于fatal exception
,从而阻止应用程序取得任何进展。
当发生这种类型的事情时,Rails有一些中间件可以捕获异常,并将其传递给错误处理页面。我会在一分钟内解释一下。
但事实仍然是,如果您将收到错误 - 您希望堆栈的其余部分如何工作? 也许MYSQL表不存在 - 如果您在布局中调用相同的数据或其他什么怎么办?
您正在寻找的是以下两件事之一:
- 处理特定错误的方法(IE无数据)
- 一种以受控方式拯救异常的方法(IE没有默认"异常"来自Rails的页面。
醇>
这不是答案,但它会有所帮助......
所有Rails异常都由名为config.exceptions_app
的中间件钩子处理:
实际的中间件是ActionDispatch::ShowException
,可以看到here。
任何"自定义异常页面"您获得的教程将基本上挂钩config.exceptions_app
中间件,使用self.routes
或控制器调用。
我已经参与custom error pages一段时间了; I wrote a gem为此。有几点需要了解。
Rails调用了2组错误 - 40x
& 50x
:
40x
(如404
)用于缺少资源 50x
(如500
)用于服务器故障。两者之间的区别在于404错误(无路由或无数据)不是致命的。 500个错误 致命(因为它们阻止您的应用运行)。
使用应用程序的其他基础架构无法挽救500个错误;它们可能是您的数据库中没有连接到没有任何值的变量的任何内容。
您希望拯救哪种类型的错误?
因此,如果它是"没有数据"错误,您将能够处理@variable.nil?
条件。
如果它更严重(堆栈中存在问题),您期望发生什么?你的观点&布局将加载没有数据?如果数据库连接断开怎么办?
-
我能给出的最佳建议是处理控制器中的任何应用级异常。观点,EG:
#app/views/data/object.html.erb
<% if @variable.any? %>
如果你想&#34;美化&#34;您的错误页面,您最好使用其中一个建议here,或者只使用我帮助编写的exception_handler
gem。
答案 1 :(得分:0)
使用此代码:
@sample_models.select{|sm| sm.errors.present?}.collect(&:errors)