2010-12-16 11 views
7

Próbuję odszyfrować kilka haseł do migracji bazy danych. Mam trochę starszego kodu Railsów (właściwie skrypt Runner), który odszyfrowuje je w porządku. Ale wprowadzenie tego samego kodu do zadania Rake powoduje, że zadanie kończy się niepowodzeniem z ... niezdefiniowaną metodą `to_a 'dla" tajnego klucza ": String ...Railsy: dlaczego wywołanie to_a na ciągu nie jest poprawne w zadaniu rake?

Dlaczego wywoływanie to_a na łańcuchu było nieprawidłowe w zadaniu Rake, ale całkowicie poprawne w skrypcie 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)

+0

co czy porażka? – zsalzbank

Odpowiedz

12

W Ruby 1.9, String nie ma metodę to_a. Twój starszy kod prawdopodobnie użył Ruby 1.8, co się stało.

+1

To prawda, ale odpowiedź @tihm pomaga więcej, ponieważ w rzeczywistości odpowiada na pytanie. – Christian

16

Aby powielić funkcjonalność 1.8.7:

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

użyłbyś:

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

innych odpowiedzi sugerują #chars, która nie jest taka sama:

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

dzięki! wystąpił ten błąd, ponieważ stary pakiet TextMate – Rafa

+0

nie jest "foo'.lines.to_a" takim samym, jak '' foo'.lines'' – barlop

Powiązane problemy