将模型传递给 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_token
和 pw_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?
在重构中,我需要将一个 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_token
和 pw_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?