【问题标题】:How to check if variable has error如何检查变量是否有错误
【发布时间】:2015-09-30 07:53:04
【问题描述】:

在查看之前如何检查我的控制器中的变量是否有错误。

在我的控制器中:

def index
    @sample_model = Model.all
    rescue => e
    flash.now[:alert] = e.message
end

例如我有错误ActiveRecord::StatementInvalid: Mysql2::Error: Table 'models' doesn't exist: ...

我想在去看之前先检查一下,这样我就可以给它看我的闪光灯了。

【问题讨论】:

  • 您对 rails 显示错误的标准方式有疑问吗?也就是说,如果您删除 rescue 子句,会出现错误?如果是这样,你想达到什么目的?

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

我期待看到一个解决方案(这本身并不是一个答案);我想强调几点:


我想先检查一下,然后再查看 ,这样我就可以展示我的 闪光。

您希望如何在 Flash 中显示错误?

很多时候,这种性质的错误会导致相当于fatal exception,从而阻止应用程序取得任何进展。

当这种类型的事情发生时,Rails 有一些中间件来捕获异常,并将其传递给错误处理页面。我会在一分钟内解释这一点。

但事实仍然是,如果您将收到错误 - 您希望堆栈的其余部分如何工作? 也许 MYSQL 表不存在 -- 如果你在布局中调用相同的数据或其他什么?


您正在寻找的是以下两件事之一:

  1. 一种处理特定错误的方法(IE 无数据)
  2. 一种以受控方式挽救异常的方法(IE 没有来自 Rails 的默认“异常”页面。

config.exceptions_app

这不是答案,但会有所帮助...

所有 Rails 异常都由名为 config.exceptions_app 的中间件挂钩处理:

实际中间件是ActionDispatch::ShowException,可见here

您获得的任何“自定义异常页面”教程基本上都将通过self.routes 或控制器调用与config.exceptions_app 中间件挂钩。

我参与custom error pages 已经有一段时间了; I wrote a gem 为它。有几个要点需要理解。

Rails 调用 2 组错误 - 40x50x

  • 40x(如404)用于缺少资源
  • 50x(如500)用于服务器故障

两者的区别在于 404 错误(要么没有路由,要么没有数据)不是致命的。 500 个错误是致命的(因为它们会阻止您的应用运行)。

500 错误无法通过您应用的其他基础架构来挽救;它们可能是您数据库中与没有任何值的变量没有连接的任何内容。


您希望解决什么类型的错误?

因此,如果是“无数据”错误,您可以使用@variable.nil? 条件处理。

如果是更严重的问题(问题更进一步),您预计会发生什么?您的视图和布局将在没有数据的情况下加载?如果您的数据库连接中断怎么办?

--

我能给出的最佳建议是在您的控制器和视图中处理任何应用级异常,例如:

#app/views/data/object.html.erb
<% if @variable.any? %>

如果你想“美化”你的错误页面,你最好使用here 的建议之一,或者干脆使用我帮助编写的exception_handler gem。

【讨论】:

  • 我认为这比我输入的答案要好得多。
  • 谢谢哥们,这意味着很多!
【解决方案2】:

使用此代码:

@sample_models.select{|sm| sm.errors.present?}.collect(&:errors)

【讨论】:

  • 我尝试了类似的方法,但没有运气。我得到了这个 &lt;NoMethodError: undefined method 'errors' for #&lt;#&lt;Class:0x007f9489d7ccb8&gt;:0x007f9489dd3608&gt;&gt;
  • 请注意,@sample_model 是模型对象的集合 - 不是一个。该集合没有错误方法。
猜你喜欢
  • 2014-03-05
  • 1970-01-01
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-10
  • 2021-11-08
相关资源
最近更新 更多