我已经看了桑迪梅茨'nothing is something演示文稿几次现在。我意识到我在我的rails项目中遍地都没有检查,但我不知道如何避免零检查,以及如何在关联方面以面向对象的方式进行检查。面向对象的方式做零检查协会在轨道
考虑这些协会:
#app/models/user.rb
class User < ActiveRecord::Base
belongs_to :blog
end
#app/models/blog.rb
class Blog < ActiveRecord::Base
belongs_to :hash_tag
has_one :user
end
#app/models/hash_tag.rb
class HashTag < ActiveRecord::Base
has_one :blog
end
我抢用户:
@user = User.find(1)
而且我想找到他的博客:
@user.blog
=> nil
在这里返回nil
因为这user
情况没有关联blog
,所以下面翼码将打破应用程序,如果我做了这样的事情本user
:
@user.blog.title
=> undefined method `title' for nil:NilClass
简单的解决方法是做到这一点的非面向对象的方式,只是做一个零检查(但是这是我们所希望的为了避免因为否则为零检查是绝对无处不在的应用程序):
@user.blog.title if @user.blog
做零检查变得更加繁琐,程序越深,你去通过协会象下面这样:
@user = User.find(1)
if @user.blog && @user.blog.hash_tag #checking for nil twice
@user.blog.hash_tag.tag_name
end
避免对关联进行零检查的面向对象的方法是什么?
我知道铁轨'try method,虽然梅斯似乎没有推荐try
方法。也许,虽然说到rails中的关联:try
是最好的选择吗?
**只是一个建议:* *而不是发射'@user.b日志“,你可以把它放在一个像@user_blog = @ user.blog这样的变量中,然后检查它是否存在,如:@ user_blog.present?' – Abhi