2

在过去的 6 个月里,我一直在学习 Rails。我认为这很棒!

但是,我的应用程序遇到的 99% 的错误都是零错误。我要么尝试显示一个为零的字段,要么外键指向已删除的记录。

我在很多地方都有这种类型的代码:

        <% if location.parent != nil %>
          <td><%= location.parent.name %></td>
        <% else %>
          <td></td>
        <% end %>

      <% if location.client_id != nil %>
        <td><%= location.client.client_name %></td>
      <% else %>
        <td></td>
      <% end %>

我真的希望Rails 在该字段为零时只显示一个空白!或者,设置一个错误的闪光灯并仍然显示页面。相反,页面炸弹。在 Heroku 上,您会收到“抱歉,出了点问题......”

有没有办法更好地处理空白字段?有没有更好的方法来编写上述代码?是否有一些我不知道的 Rails 设置?是否有宝石可以处理这些类型的错误?

4

2 回答 2

3

你真的应该在你的关联上放置一些外键约束after_destroy 方法。这将阻止您的数据库进入不一致的状态。

但除了重构之外,您还应该检查 ActiveSupport 以及它对 ruby​​ 所做的各种添加。请参阅http://guides.rubyonrails.org/active_support_core_extensions.html

我认为对您有帮助的任何对象都可以使用三种方法:

  • blank?- 如果对象为 nil、empty?、false 等条件,则返回 true。请参阅文档以获得更好的解释。
  • present?- 如果对象不为零,不为空,则返回 true?或真的。请参阅文档以获得更好的解释。
  • try(:foo)- 尝试调用foo对象上的方法,如果对象为 nil,则返回 nil。请参阅文档以获得更好的解释。

有了这个,您的示例代码可能是:

<td><%= location.parent.try(:name) %></td>
<td><%= location.parent.try(:client_name) %></td>

我真的建议你看看为什么你期望一个对象不为零。迁移中的外键约束和关联的 after_destroy 挂钩将对此有所帮助。

于 2013-02-18T03:43:16.963 回答
0

不是 Rails 修复,但您可以使用面向对象设计的 NullObject 模式来重构代码以不同方式处理“nil”。该模式基本上意味着您为一个对象创建一个 null/nil 类,该对象在它为 nil 时进行处理。它有一些缺点:需要维护一个额外的类,并且当您添加可能为 nil 的新方法时,您必须记住编辑 null 类。好处是它将条件句移出视图。

这是关于这个主题的一篇很好的博客文章: http ://robots.thoughtbot.com/post/20907555103/rails-refactoring-example-introduce-null-object

另一个建议是将条件句从您的视图中移出并移到助手中。助手是包含视图逻辑的简单模块。我经历了视图中所有逻辑的视图,它使视图代码很快变得一团糟。

于 2013-02-18T03:21:36.087 回答