2013-02-17 65 views
1

我一直在学习过去6个月的Rails。我认为这太棒了!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设置?是否有宝石来处理这些类型的错误?

回答

1

你真的应该放置一些foreign key constraintsafter_destroy methods on your associations。这将停止您的数据库进入不一致状态。

但是除了那个重构,你应该检出ActiveSupport和它对ruby的各种增加。见http://guides.rubyonrails.org/active_support_core_extensions.html

有三种方法,其可我认为这将有助于你在任何对象上:

  • blank? - 如果对象是零,空?,虚假和其他条件,则返回true。请参阅the documentation以获得更好的解释。
  • present? - 如果对象不是零,不为空,则返回true?或者是真的。请参阅the documentation以获得更好的解释。
  • try(:foo) - 尝试在对象上调用方法foo,如果对象为零,则返回nil。有关更好的解释,请参见the documentation

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

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

我真的建议你看一下为什么你期待的对象不为零。 Foreign key constraints在您的迁移和after_destroy hooks for your associations将有助于此。

+0

谢谢 - 我会进一步调查你的建议。 – Reddirt 2013-02-18 14:40:19

+0

我想你还应该解释安全导航操作员的好处。而不是'try' – 2017-07-11 18:37:47

+0

公平的评论 - 虽然当我回答这个问题时,ruby 2.3并没有发布(发布前两年!)。 TBH我个人尽量避免使用'try'或'&.',因为它会导致代码中保护条款不足或忽略得墨忒耳定律。 – roo 2017-07-16 13:34:55

0

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

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

另一个建议是移动的条件语句您的观点,进入帮手。助手是包含视图逻辑的简单模块。我在视图中看到了所有的逻辑,并且它使视图代码非常迅速地混乱。

+0

感谢您的想法! – Reddirt 2013-02-18 15:00:16

相关问题