过去6个月我一直在学习Rails。我觉得这很棒!
但是,我的应用程序获得的99%的错误都是零错误。我要么尝试显示nil字段,要么外键指向已删除的记录。
我在很多地方都有这种类型的代码:
<% 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设置?有没有宝石可以处理这些类型的错误?
答案 0 :(得分:1)
你应该放置一些foreign key constraints和after_destroy methods on your associations。这将阻止您的数据库进入不一致的状态。
但除了重构之外,你应该检查一下ActiveSupport以及它对ruby的各种补充。请参阅http://guides.rubyonrails.org/active_support_core_extensions.html。
我觉得有三种方法适用于任何我认为对您有帮助的对象:
blank?
- 如果对象为nil,empty?,false和其他条件,则返回true。有关更好的解释,请参阅the documentation。present?
- 如果对象不是nil而不是空,则返回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将对此有所帮助。
答案 1 :(得分:0)
不是Rails修复,但您可以使用面向对象设计的NullObject模式来重构代码以不同方式处理“nil”。该模式基本上意味着您为一个对象创建一个null / nil类,该对象在nil时处理。它有一些缺点:要维护一个额外的类,你必须记住在添加可能为零的新方法时编辑null类。好处是它将条件移出视图。
这是关于这个主题的好文章: http://robots.thoughtbot.com/post/20907555103/rails-refactoring-example-introduce-null-object
另一个建议是将条件移出您的视图并转移到帮助者中。助手是包含视图逻辑的简单模块。我在视图中遇到了所有逻辑的视图,它使视图代码很快变得混乱。