Hello folks, i’m learning ruby and i’m trying to keep code running after getting inputs from user how is that ?
this is my code :
begin
puts '---------please enter database name---------'
database = gets
puts '---------hello please enter username---------'
username = gets
# Attributes
database = gets
username = gets
connection = PG.connect dbname: database, user: username
system("pg_dump -h localhost -p 5432 #{database} > backup.sql")
rescue PG::Error => e
puts e.message
ensure
connection&.close
end
I’m a little confused. Firstly, you are going to need to chomp
your user inputs to remove the trailing newline:
database = gets.chomp
but I really don’t understand why you are making the connection to the database, and then shelling out to a pg_dump
command that doesn’t use the connection?
i’m trying to backup the database hhh i know it so dump, i’m learning ruby
btw any good practice ?
pg_dump
makes its own connection to the database. You don’t need to make another connection in Ruby as well, because it won’t be used.
Just a suggestion
If you want to read user input from standard input, use STDIN.gets
, instead of gets (Kernel.gets
).
Kernel.gets
actually reads command line arguments and assumes that the argument is a file. Here’s an example (screenshot):
Without argument, gets
behaves like STDIN.gets
, with arguments it reads the file with argument (ARGF
) and then shifts it. If you put another gets, it will read the next argument as file.
In my case you see I didn’t have the 1234 file, so my program crashes. But after creating the file, it didn’t. If 1234 has some contents, gets
will return that.
So my suggestion is to use STDIN.gets
. Otherwise, don’t be upset if your program crashes.
Other Notes:
-
Also note that to make it robust use STDIN.gets.to_s
because some non TTY terminals (like terminal in atom text editor or visual studio editor), STDIN.gets
returns nil
… to_s won’t make your program consume more memory if your STDIN.gets has something, but it will return empty string (new object) if STDIN.gets
returns nil.
-
You can also use something = STDIN.gets &.chomp
. In this case, if STDIN.gets
returns nil
, the variable “something” will be nil, and program won’t crash.
1 Like