How to use ruby script/console to debug methods in application.rb?

Hello everyone,

newbie question:

I have a couple of methods that interact with a remote python server
in application.rb.
Is there a convenient way to debug them? e.g. run them from "ruby
script/console" - debug-console and see the return values?

Example-method:

  def addUserToServer?(category_name, useremail_address)
    socket = TCPSocket.open(host, port)
    cmd = "COMMAND:adduser;;CAT:" + (category_name,
    cmd += ";;EMAIL:" + useremail_address
    socket.puts(cmd)
    result = socket.rcv(1024)
    socket.close()
  end

I'd like to see contents of result f.ex. and then return true or false
accordingly.

Rails is version 2.2.2

Any help on this or some other best practice to check those methods is
appreciated.

Lukas

lukas wrote:

Hello everyone,

newbie question:

I have a couple of methods that interact with a remote python server
in application.rb.
Is there a convenient way to debug them? e.g. run them from "ruby
script/console" - debug-console and see the return values?

Just set a breakpoint, run script/server -u, and play around in the
debugger.

Example-method:

  def addUserToServer?(category_name, useremail_address)

That should be add_user_to_server. camelCase is considered poor style
in Ruby.

    socket = TCPSocket.open(host, port)
    cmd = "COMMAND:adduser;;CAT:" + (category_name,

You know you've got mismatched parentheses, right? And string
concatenation is more efficient with the "#{}" syntax.

    cmd += ";;EMAIL:" + useremail_address
    socket.puts(cmd)
    result = socket.rcv(1024)
    socket.close()

You don't need empty parentheses when a function doesn't take arguments.
Frankly, your code looks more like Java than Ruby.

  end

I'd like to see contents of result f.ex. and then return true or false
accordingly.

Rails is version 2.2.2

Any help on this or some other best practice to check those methods is
appreciated.

Test-first development will reduce the need for debugging.

Lukas

Best,

Marnen,

thanks for your feedback.
Indeed, I'm a newbie ruby programer. I'll keep your advice in mind.

I was just hoping I could run the method from the debugging console
and check the output directly.

Hi Lukas,

You definitely can, by adding some temporary debug puts calls
interspersed in your method, and then calling your method either
using ./script/runner or from within a ./script/console session.

To make that method easier to test, I'd relocate that method outside
of ./app/controllers/application.rb and put it somewhere else, maybe
something like ./app/models/remote_socket_server.rb.

Possibly lame example, but:

###### add tmp debug calls to meth you want to test:
$ cat ./app/models/remote_socket_server.rb
class RemoteSocketServer

  HOST = ....
  PORT = ....

  def RemoteSocketServer.add_user(category, email)
    puts("add_user: category=#{category} email=#{email}") #DEBUG
    socket = TCPSocket.open(HOST, PORT)
    ...
  end
...
end

###### start console and call the meth:
$ ./script/console
...

RemoteSocketServer.add_user("Stuff", "foo@bar.net")

add_user: category=Stuff email=foo@bar.net
...

###### or run the meth via runner:
$ ./script/runner 'RemoteSocketServer.add_user("Stuff",
"foo@bar.net")'
add_user: category=Stuff email=foo@bar.net
...

Also note that instead of using puts to stdout, you could change those
debug puts calls to use the environment's logger instead:

    ...
     ActionController::Base.logger.debug("add_user:
category=#{category} email=#{email}") #DEBUG
    ...

such that when that meth is called (via console, runner, or in the web
app), you can just look at the env log:

$ tail -100 ./log/development.log | grep "^add_user"
add_user: category=Stuff email=foo@bar.net
...

Once you're done with your temp testing of the meth, just wipe out
those debug puts/logger calls.

Jeff

lukas wrote:

Marnen,

thanks for your feedback.
Indeed, I'm a newbie ruby programer. I'll keep your advice in mind.

OK. You're most welcome.

I was just hoping I could run the method from the debugging console
and check the output directly.

You can. And I explained how. script/console is not a "debugging
console".

Best,

Thanks Jeff,

it worked. We've been able to test the whole stack of methods. :slight_smile:

And I've learned something today.

Regards
Lukas