TL; DR
Use em STDIN.gets
vez 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 runner
falhou 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