Forum: Ruby on Rails How to use ruby script/console to debug methods in application.rb?

Posted by lukas (Guest)
on 2010-02-08 23:11
(Received via mailing list)
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
Posted by Marnen Laibow-Koser (marnen)
on 2010-02-08 23:23
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 Laibow-Koser
http://www.marnen.org
marnen@marnen.org
Posted by lukas (Guest)
on 2010-02-09 19:01
(Received via mailing list)
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.
Posted by Jeff Burlysystems (jburly)
on 2010-02-09 20:27
(Received via mailing list)
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
Posted by Marnen Laibow-Koser (marnen)
on 2010-02-09 20:44
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,
-- 
Marnen Laibow-Koser
http://www.marnen.org
marnen@marnen.org
Posted by lukas (Guest)
on 2010-02-10 00:33
(Received via mailing list)
Thanks Jeff,

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

And I've learned something today.

Regards
Lukas
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.