Rails: почему вызов to_a для строки недопустим в задаче rake? - PullRequest
7 голосов
/ 17 декабря 2010

Я пытаюсь расшифровать несколько паролей для переноса базы данных. У меня есть какой-то старый Rails-код (на самом деле скрипт Runner), который прекрасно их расшифровывает. Но помещение этого же кода в задачу Rake приводит к сбою задачи с ... неопределенным методом to_a для secretkey: String ...

Почему вызов to_a для строки будет недопустимым в задаче Rake, но совершенно допустимым в скрипте 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 ]

18 голосов
/ 30 апреля 2012

Для дублирования функциональности 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']
12 голосов
/ 17 декабря 2010

В ruby ​​1.9 у String больше нет метода to_a.Ваш старый код, вероятно, использовал Ruby 1.8, который сделал.

7 голосов
/ 17 декабря 2010

Строковые объекты не имеют to_a. Посмотреть здесь: http://ruby -doc.org / рубин-1,9 / классы / String.html

Вы можете использовать:

"foo".chars.to_a

Что приводит к:

["f","o","o"]
1 голос
/ 17 декабря 2010
"abcd".each_char.map {|c| c }
0 голосов
/ 15 января 2019

Если вы анализируете объект сериализации для использования на apis, вы можете:

JSON.parse "[]" # => []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...