如何重构多个模型中出现的方法?

时间:2015-12-27 10:36:57

标签: ruby-on-rails ruby-on-rails-4 model-view-controller model refactoring

我有一个在多个模型中重复的方法。我应该在多个模型中重复此代码,还是可以将方法包含在一个位置并将其提供给多个模型?

  # Returns true if the given token matches the digest.
  def authenticated?(attribute, token)
    digest = send("#{attribute}_digest")
    return false if digest.nil?
    BCrypt::Password.new(digest).is_password?(token)
  end

1 个答案:

答案 0 :(得分:4)

您最好使用concern,但理论上您也可以使用superclass

Concerns

这是标准的Rails功能:

#app/models/concerns/auth.rb
module Auth
  extend ActiveSupport::Concern

  def authenticated?(attribute, token)
     digest = send("#{attribute}_digest")
     return false if digest.nil?
     BCrypt::Password.new(digest).is_password?(token)
  end
end

然后您只需在模型中加入auth

#app/models/your_model.rb
class YourModel < ActiveRecord::Base
   include Auth
end

Excellent writeup here

<强>超类

另一种方法是创建一个&#34;超类&#34;。

这将是hacky(因为它用另一个模型填充ActiveRecord方法链),但尝试可能很有趣。

#app/models/auth.rb
class Auth < ActiveRecord::Base
   def authenticate?
     ....
   end
end

#app/models/user.rb
class User < Auth
   self.table_name = self.model_name.plural
end

老实说,这种方法看起来很麻烦,虽然它可以让你扩展模型功能远远超过concern

参考文献: