Obtendo informações de dentro de uma tarefa Rake

TL; DR

Use em STDIN.getsvez de apenas gets. Rake não disponibiliza o STDIN implicitamente.

Versão longa

Eu estava escrevendo uma tarefa Rake rápida esta manhã e precisava converter um script bastante básico que pega a entrada do usuário e a passa para um localizador ActiveRecord, mas o script que funcionava rails runnerfalhou com esse erro ao movê-lo dentro de uma tarefa Rake.

Roteiro Original:

def prompt(*args)
print
(*args)
gets

end

username
= prompt "What is the username of the user you wishing to configure? "
password
= prompt "What is this user's password? "
u
= User.where(username: username).first

if u.activate_user!(password)
puts
"Successfully activated user #{username}"
else
puts
"Failed to activate user #{username}. Was your password wrong?"
end

Movendo-o para uma tarefa Rake. O erro críptico que recebi foi

What is the username of the user you wishing to configure?rake aborted!
No such file or directory @ rb_sysopen - my_app:configure_user`

O problema é que o Rake não disponibiliza o STDIN implicitamente. Uma mudança simples foi no método prompt:

def prompt(*args)
print
(*args)
STDIN
.gets
end