Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 Rails无错误-有什么方法可以阻止它们?_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 3 Rails无错误-有什么方法可以阻止它们?

Ruby on rails 3 Rails无错误-有什么方法可以阻止它们?,ruby-on-rails-3,Ruby On Rails 3,在过去的6个月里,我一直在学习Rails。我觉得它很棒 但是,我的应用程序99%的错误都是零错误。我试图显示一个为零的字段,或者外键指向已删除的记录 我在很多地方都有这种类型的代码: <% if location.parent != nil %> <td><%= location.parent.name %></td> <% else %> <td>&l

在过去的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上,你会听到“对不起,出了点问题……”


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

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

这里有一篇关于这个主题的好博文:


另一个建议是将条件句从您的视图中移到helpers中。助手是包含视图逻辑的简单模块。我在视图中遇到了视图及其所有逻辑,这使得视图代码很快变得一团糟。

您真的应该放置一些和。这将阻止数据库进入不一致状态

但除了重构之外,您还应该检查ActiveSupport及其对ruby的各种添加。看

有三种方法可用于任何对象,我认为对您有帮助:

  • blank?
    -如果对象为nil、empty、false和其他条件,则返回true。请参阅以获得更好的解释
  • present?
    -如果对象不是nil,不是空的,则返回true?或者是真的。请参阅以获得更好的解释
  • try(:foo)
    -尝试调用对象上的方法
    foo
    ,如果对象为nil,则返回nil。请参阅以获得更好的解释
使用此示例,您的示例代码可以是:

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


我真的建议你看看为什么你期望一个对象不是零。这将有助于您的迁移。

谢谢-我将进一步调查您的建议。我认为您还应该解释安全导航操作员的好处。与
相反,请尝试
公正的评论-尽管当我回答这个问题时,ruby 2.3没有发布(发布前两年!)。TBH我个人尽量避免使用
try
&.
,因为这会导致代码没有足够的保护条款或忽略德米特定律。