PHP developer still writing PHP in Ruby/Rails

Hi,

I’m a former PHP developer moving to Ruby and Rails. I’ve written a little rake task to provide an interactive console for setting and removing session values to help debugging the site. It all works, only thing is that it feels to me like I´ve written Ruby in PHP style but I don’t know where to start fixing it. I would appreciate any suggestions.

I´ve put it into pastie at: http://pastie.caboo.se/98992 but I’ve also copied it below.

In my generic debugging rake tasks file:

desc ‘View and edit session data’

task :sessions => :environment do
# Message used when finding sessions
msg_session = <<-EOF
** SESSION CHECKER
Enter a session id to find the session in the format of
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn

/(q)uit
EOF

# When viewing a session
msg_view = <<-EOF

Commands:
/(v)iew to view all values in the session
= to set a value

(d) to delete that field from the session
(f)ind to search for a new session
(q)uit to exit
EOF

# Begin session finding loop
loop do

  breaker = nil
 
  # Output the message
  puts msg_session
  print '> '
 
  # What are we doing?
  str = STDIN.gets.chomp
  break if str.empty? || str =~ /^q$/i

 
  # Does this session exist?
  if CGI::Session::ActiveRecordStore::Session.exists? :session_id => str
    session_id = str
    watch = []
   
    loop do
      session = CGI::Session::ActiveRecordStore::

Session.find_by_session_id session_id

      # Display the session data sorted, with the modified fields shown in green
      longest_key = 0
       session.data.each { |k,v| longest_key = k.to_s.length

if k.to_s.length > longest_key }

      puts "\nAll variables in session: %s" % session.session_id
      session.data.each do |k,v|
        str = "  :%-#{longest_key}s => %s" % [k, CfSimple.describe_var(v)]
        puts watch.member?(k) ? green(str) : str
      end
     
      # What are we doing with this item?
      puts msg_view
      print '> '

     
      str = STDIN.gets.chomp
      next if str.empty? || str =~ /^v$/i
      breaker = :quit and break if str =~ /^q$/i
      breaker = :find and break if str =~ /^f$/i
     
      if str =~ /^d ([a-z0-9 _]+)/i
        puts red('Deleted %s' % $1)
        session.data.delete $1.intern
        session.save
        next
      end
     
      # We're updating a value
      if str =~ /([^=]+)=(.*)/
        # Is the assignment valid yaml?
        valid = true
        YAML::parse(':%s: %s' % [$1, $2]) rescue valid = false

        # Not good YAML
        puts(red('Invalid assignment. Must be valid YAML.')) and next unless valid
       
        # Now enter this as our new data
        session.data

[$1.intern] = YAML::parse($2).transform
session.save

        # Add it to the watches
        watch << $1.intern
       
        next
      else
        puts red('Invalid assignment. Must match: /([^=]+)=(.*)/')

      end
    end
  else
    puts 'Error finding session %s' % str
  end
 
  break if breaker == :quit
end

end

CfSimple is a library of basic debugging functions. I’ve just include the one in use above.

class CfSimple

def self.describe_var(var)
return (var.nil? ? ‘nil’ : var) if [NilClass, TrueClass, FalseClass].member? var.class

  vals = [var.class.to_s + (!var.nil? && var.respond_to?(:length) ? '(%s)' % var.length : '') + ':']
 
  if var.is_a? Array
      vals << '[%s]' % var.collect{ |a| describe_var a }.join(', ')
  elsif var.is_a? Hash
      vals << '{%s}' % var.collect{ |a| describe_var a }.join(', ')
    elsif var.is_a? Numeric
        vals << '%s' % var
    else

        vals << '"%s"' % var
    end
 
  vals.join ' '
end

end