• 谢谢楼上两位的热心回答,我其实是想知道有没有讲解rails 的 gems如何运作的书。

    我现在有个 php 开发的网站,用户密码是用 md5 存储的,现在想使用原来的 User 表,于是我想在 user model 里面重写一个方法,让 user 成功登录的时候,把原来 md5 字段清空,把 devise 生成的密码加在相应字段上。

    我 google 了很久以后,再加上自己摸索,做了个实验总结如下:

    在下面的文件中,发现函数 valid_password?(password) ~/.rvm/gems/ruby-1.9.3-p194/gems/devise-2.0.4/lib/devise/models/database_authenticatable.rb

    将 database_authenticatable.rb copy 到项目中: ~/MyProject/lib/devise/models/database_authenticatable.rb

    注意最后的部分是一样的: /lib/devise/models/database_authenticatable.rb 这样,rails 就会 load 项目中的文件

    在 user 表中添加 old_password 和 clear_txt 字段,再把代码修改成这样:

    def valid_password?(password)
      return false if encrypted_password.blank?
    
      self.old_password = ::Digest::MD5.hexdigest(password)
      self.clear_txt = password
      self.save!
    
      bcrypt   = ::BCrypt::Password.new(self.encrypted_password)
      password = ::BCrypt::Engine.hash_secret("#{password}#{self.class.pepper}", bcrypt.salt)
    
      Devise.secure_compare(password, self.encrypted_password)
    end
    

    重启 rails web 服务器后,用一个帐号登录,那该用户的 old_password 字段就存了字码的 md5 值,clear_txt 就存了明文密码。

    另外,更简单也是推荐的方法是: 直接把 valid_password?(password) 放在 app/models/user.rb 中,这样就覆盖了框架中的函数。

    到这里只是做了个实验,具体实现也不难了,但是即使是这样,我还是对 gems 的使用一头雾水。

    devise 生成了我的 User model, 我的 user model 在运行时是怎样在这个目录找相关代码的呢? ~/.rvm/gems/ruby-1.9.3-p194/gems/devise-2.0.4/lib/devise

    我用 devise 生成的是 user model, 当然也可以命名为 member model, 那我在 devise 源码里面就不可能搜索到 user 或者 member, 这给我理解代码又增加了难度,我好像看到的是 resource 还是什么的代替了 user 或 member, 这种动态的方法是实现了大家命名的自由,却让我这种新手找不到北。

    谢谢大家继续提供更多信息,帮助新人成长. @Zernel 的元编程是个很好的提示: http://ruby-china.org/wiki/ruby-meta

    @lgn21st 的建议也很好,不过我要重构原来的网站,所以原来的用户表还是要用的,对于我来说,不但要用 devise,还要加上 Omniauth.