"authenticate“方法只能在这里找到:https://apidock.com/rails/ActiveModel/SecurePassword/InstanceMethodsOnActivation/authenticate,版本6.0.0是灰色的。因此,这似乎已经过时了。
我在Rails6文档中搜索了authenticate方法,但在https://api.rubyonrails.org/classes/ActiveModel/SecurePassword/ClassMethods.html下没有找到它的记录。然而,在同一页上的代码片段中
# Schema: User(name:string, password_digest:string, recovery_password_digest:string)
class User < ActiveRecord::Base
has_secure_password
has_secure_password :recovery_password, validations: false
end
user = User.new(name: 'david', password: '', password_confirmation: 'nomatch')
user.save # => false, password required
user.password = 'mUc3m00RsqyRe'
user.save # => false, confirmation doesn't match
user.password_confirmation = 'mUc3m00RsqyRe'
user.save # => true
user.recovery_password = "42password"
user.recovery_password_digest # => "$2a$04$iOfhwahFymCs5weB3BNH/uXkTG65HR.qpW.bNhEjFP3ftli3o5DQC"
user.save # => true
user.authenticate('notright') # => false
user.authenticate('mUc3m00RsqyRe') # => user
user.authenticate_recovery_password('42password') # => user
User.find_by(name: 'david')&.authenticate('notright') # => false
User.find_by(name: 'david')&.authenticate('mUc3m00RsqyRe') # => user
身份验证方法仍在使用(user.authenticate)。如果我在最新的文档中找不到这个方法,它是从哪里来的?
编辑:关于文档差异的一个相关问题:我能够在rubydocs上找到ActionDispatch::Request::Session,但在api.rubyonrails上找不到。https://www.rubydoc.info/docs/rails/ActionDispatch/Request/Session
https://api.rubyonrails.org/classes/ActionDispatch/Request.html
现在,我不确定在搜索方法时应该在哪里查找。api.rubyonrails不是寻找文档的“权威”地方吗?
发布于 2020-12-21 00:06:51
看起来他们忘了在has_secure_password的文档中提到这一点。如果你查看ActiveModel::SecurePassword的source code。你会发现
# Returns +self+ if the password is correct, otherwise +false+.
#
# class User < ActiveRecord::Base
# has_secure_password validations: false
# end
#
# user = User.new(name: 'david', password: 'mUc3m00RsqyRe')
# user.save
# user.authenticate_password('notright') # => false
# user.authenticate_password('mUc3m00RsqyRe') # => user
define_method("authenticate_#{attribute}") do |unencrypted_password|
attribute_digest = public_send("#{attribute}_digest")
BCrypt::Password.new(attribute_digest).is_password?(unencrypted_password) && self
end
alias_method :authenticate, :authenticate_password if attribute == :password您现在可以根据提供给has_secure_password方法的参数名称将其定义为动态方法。因此,他们以更通用的方式实现了它。为了更友好地向后兼容,我们为authenticate_password实现了别名authenticate,这是最初的实现。
不幸的是,这些动态方法并没有很好地记录在rails API文档中。
https://stackoverflow.com/questions/65379605
复制相似问题