将模型传递给 rails 中的方法

passing a model to a method in rails

在重构中,我需要将一个 generate_token 方法移出我的用户模型,以便它可以被其他模型调用。

这是方法代码:

def generate_token(column)
  begin
    self[column] = SecureRandom.urlsafe_base64
  end while User.exists?(column => self[column])
end

传递列的位置允许用户模型根据需要生成许多不同的标记。该方法的调用方式如下:

def some_other_method
  generate_token(:token_column_name)
  ...
end

我的用户模型当前将两个不同的标记列传递给该方法:auth_tokenpw_reset_token

我的第一个想法是将它放在 /lib/generate_token.rb 中,然后使用 include generate_token 从模型中调用它。我不必在包含中传递列参数,因为它只是包含方法,而不是调用它。

对我来说挑战是end while User.exists?(column => self[column])。这可以防止该方法在已经存在的情况下生成新的令牌。但是,这是假设用户模型;相反,我需要重构它以采用调用该方法的模型,并将其作为变量传递给该方法,例如:

include generate_token(model_name)

以便代码现在可以读取

end while [Model].exists?(column => self[column])

这可能吗?我该怎么做?

绝对是一个图书馆 class 是去这里的方式,或者更具体地说,一个 Rails Concern(在这种情况下相同的差异)。

也就是说,您可以调用 self.class 来获取 class,然后执行 self.class.exists?