我正在维护一个Rails 2.3应用程序(移动到Rails 4破坏了太多东西),并试图加密/解密密码,而不是将其以明文形式保存在数据库中。
按照attr_encrypted gem的说明,我添加了
gem "attr_encrypted"
到我的Gemfile,运行bundle install - all happy.
然后,根据指令,我将一个新字段encrypted_password迁移到表中,并在app/models/serverobj.rb中添加一行:
attr_encrypted :password, :key => 'foo'
但是当我在那里浏览时,我得到这样的堆栈跟踪:
=> Booting WEBrick...
/home/art/vendor/rails/activerecord/lib/active_record/base.rb:1833:in `method_missing_without_paginate': undefined method `attr_encrypted' for #<Class:0x7f009f372200> (NoMethodError)
from /home/art/vendor/plugins/will_paginate/lib/will_paginate/finder.rb:164:in `method_missing'
from /home/art/app/models/serverobj.rb:17
...
from /home/art/config/environment.rb:70
serverobj.rb
,第17行是:
attr_encrypted :password, :key => 'foo'
environment.rb
,第70行是:
Rails::Initializer.run do |config|
config.load_paths += %W( #{RAILS_ROOT}/vendor/gems/ #{RAILS_ROOT}/app/exceptions/ )
啊哈!我说过,attr_encrypted gem不能在load_path中。所以我在/var/lib/gems/1.8/gems/
中找到了attr_encrypted gem,并将其添加到environment.rb
中的config.load_paths
行。
但我仍然得到'Undefined method attr_encrypted'。
我已经没有东西可以尝试了。什么好主意吗?我相信你的问题是attr_encrypted
gem(在其当前版本)与Rails 2.3不兼容。根据你的评论,Bundler跳过加载gem,因为当它这样做时会引发错误NameError: uninitialized constant ActiveRecord::VERSION
,这就是为什么在你的应用程序中没有gem的功能。
然而,gem最初是在2009年创建的,所以很可能它的旧版本将与您的Rails兼容。尝试更新您的Gemfile以使用旧版本之一,例如:
gem 'attr_encrypted', '1.0.8'
看看效果是否更好。API在不同版本之间可能会发生变化,因此请确保引用您最终使用的版本的相应README文件。