Rails:为什么在rake任务中调用to_a字符串无效?

我正在尝试为数据库迁移解密一堆密码。 我有一些旧的Rails代码(实际上是一个Runner脚本),可以很好地解密它们。 但是将相同的代码放入Rake任务会导致任务失败,并且…未定义的方法`to_a’代表“secretkey”:String …

为什么在Rake任务中调用字符串上的to_a无效,但在Runner脚本中完全有效?

require 'openssl' KEY = 'secretkey' namespace :import do task :users => :environment do def decrypt_password(pw) cipher = OpenSSL::Cipher::Cipher.new('bf-ecb') cipher.decrypt cipher.key = KEY.to_a.pack('H*') <<--------- FAILS RIGHT HERE on to_a data = data.to_a.pack('H*') data = cipher.update(data) data << cipher.final unpad(data) end end ... other methods end 

(Rails 3.0.0,Ruby 1.9.2)

在ruby 1.9中,String不再具有to_a方法。 您的旧代码可能使用了Ruby 1.8,但确实如此。

要复制1.8.7function:

 1.8.7 > 'foo'.to_a # => ['foo'] 

你会用:

 1.9.3 > 'foo'.lines.to_a # => ['foo'] 

其他答案提示#chars,这是不一样的:

 1.9.9 > 'foo'.chars.to_a # => ['f', 'o', 'o'] 

字符串对象没有to_a 。 见这里: http : //ruby-doc.org/ruby-1.9/classes/String.html

您可以使用:

 "foo".chars.to_a 

结果如下:

 ["f","o","o"] 
 "abcd".each_char.map {|c| c }