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

时间:2010-12-16 21:23:23

标签: ruby-on-rails ruby string rake

我正在尝试为数据库迁移解密一堆密码。我有一些旧的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)

5 个答案:

答案 0 :(得分:18)

复制1.8.7功能:

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']

答案 1 :(得分:12)

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

答案 2 :(得分:7)

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

您可以使用:

"foo".chars.to_a

结果是:

["f","o","o"]

答案 3 :(得分:1)

"abcd".each_char.map {|c| c }

答案 4 :(得分:0)

如果要解析为要在api上使用的序列化对象,则可以:

JSON.parse "[]" # => []