从设计gem中包装/覆盖current_user方法的最佳方法是什么?

时间:2014-07-21 06:02:06

标签: ruby-on-rails design-patterns devise

一种常见的模式是在许多地方使用current_user,但要检查它是否已设置。

if current_user
  #your code
end

但是,每次要使用current_user如何哪里,您可以将current_user方法包装在不同的地方,而不是注入if检查方法ONCE,这样你就不必处理由于设计的默认current_user方法的nil值而导致的代码中断?

3 个答案:

答案 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来做这件事。