一种常见的模式是在许多地方使用current_user
,但要检查它是否已设置。
if current_user
#your code
end
但是,每次要使用current_user
,如何和哪里,您可以将current_user方法包装在不同的地方,而不是注入if检查方法ONCE,这样你就不必处理由于设计的默认current_user
方法的nil值而导致的代码中断?
答案 0 :(得分:2)
将 current_user 方法添加到 ApplicationController ,然后我认为您可以在ApplicationController中覆盖它,例如:
# in application_controller.rb
alias_method :devise_current_user, :current_user
def current_user
if ...#your validation
devise_current_user # || User.new # <-- or whatever other non-nil result
end
end
答案 1 :(得分:0)
在整个应用程序中创建具有您尝试在current_user
上使用的方法的自定义类是单向的。
http://littlelines.com/blog/2013/06/22/how-to-guard-against-ruby-nil-errors/
答案 2 :(得分:-1)
如果你不想在工作红宝石时考虑零价值的可能性,你就会在上游游泳,并且变得非常沮丧。我知道我有类似的感受。写作真的很烦人:
if current_user && current_user.attr == 'val'
但我已经开发出一些方法可以让它随着时间的推移变得不那么尴尬......
- 编辑以显示我为避免这种情况而采取的一些措施 -
我经常做这些事情。这不一定是推荐或最佳实践,但我发现它使我的代码更简洁,更有可读性
如果我期望一个数组,但数组可能是nil:
my_array ||= []
这样我就可以安全地做需要数组的事情,通常在范围内的不同地方需要这样做。
my_array.size
并没有让事情窒息。
以类似的方式我可以做
car ||= Car.new
然后我可以像任何汽车对象一样对待汽车。但是我可能不会用current_user来做这件事。